13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the number of calls to malloc and make sure that the memory is accessible by the notation arr[i][j].

这道题让我们写个C语言函数my2DAlloc用来给一个二维数组分配内存,并且让我们尽可能的少调用malloc函数。一个二维数组实际是数组的数组,我们用指针来表示数组,用双指针来表示二维数组。我们首先建立一个一维数组,对于每个位置,再建立一个一维数组,这样我们就得到了一个二维数组,参见如下代码:

int** my2DAlloc(int rows, int cols) {int **rowptr = (int**)malloc(rows * sizeof(int*));for (int i = 0; i < rows; ++i) {rowptr[i] = (int*)malloc(cols * sizeof(int));}return rowptr;
}

关于释放内存,我们不能仅仅释放rowptr,我们要确保每个cell中的内存也被释放了,参见如下代码:

void my2DDealloc(int **rowptr, int rows) {for (int i = 0; i < rows; ++i) {free(rowptr[i]);}free(rowptr);
}

其实我们还可以在连续的内存块上来分配内存,例如对于一个5行6列的二维数组,我们可以在开头的五个内存块里存上每一行的起始地址,后面的五行数据是连续排列的,一行接着一行,参见代码如下:

class Solution {
public:int** my2DAlloc(int rows, int cols) {int header = rows * sizeof(int*);int data = rows * cols * sizeof(int*);int **rowptr = (int**)malloc(header + data);if (rowptr == NULL) return NULL;int *buf = (int*)(rowptr + rows);for (int i = 0; i < rows; ++i) {rowptr[i] = buf + i * cols;}return rowptr;}
};

这样申请连续的一段内存空间的好处是只需要调用一次malloc就行,而且在释放的时候也不需要特别的写函数来free,好处还是蛮多的。

[CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组相关推荐

  1. 使用malloc动态内存分配一个二维数组

    由于一部分编译器(比如说vs 2019)不支持创建数组时元素个数为变量,今天使用malloc来实现此功能. 详细注释和代码如下 //动态内存分配 模拟二维数组 #include<stdio.h& ...

  2. 【C语言入门】已知10个学生的5门课程的成绩,将其存入一个二维数组,求每个学生的总成绩和平均成绩。

    题目:已知10个学生的5门课程的成绩,将其存入一个二维数组,求每个学生的总成绩和平均成绩. # include <stdio.h> int main() {int i, j, s = 0, ...

  3. php二维数组取交集,php array交集 PHP二维数组取差集操作方法 - 非主流娱乐网

    php array交集 PHP二维数组取差集操作方法 2019-07-11 23:14:16 来源: 非主流娱乐网责任编辑:小s0条评论 一.需求 PHP 中对二维数组取差集操作. 例如: $arr1 ...

  4. scala-尾递归,Array.newbuilder,二维数组

    尾递归: 如果一个函数为内置函数并且是尾递归的方式,可以在函数前面添加@tailrec.相当于告诉编译器我这个函数是尾递归函数,然后 编译器会对这个函数进行一些操作,把递归化解出来. Array.ne ...

  5. 【Verilog】Verilog定义二维数组(2D Array)

    目录 定义的种类 第一种 赋值方法 第二种 赋值方法 第三种 赋值方法 定义的种类 首先看几组定义类型 第一种 定义一个位宽为8的 data1(reg) 和 data2(wire) 的变量. reg ...

  6. Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标

    *8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置.返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标 题目 题目描述与运行示例 破题 代码 题目 ...

  7. Java中Arrays.toString ()打印二维数组及Array数组的常用操作

    1.Java中Arrays.toString () 已知打印一维数组的API为System.out.println ( Arrays.toString ();,其参数为数组名或数组指针,其支持的数据类 ...

  8. 6-2 指针与数组-矩阵的各列求和分数 10 本题要求实现一个函数,求一个n (小于10)行7列的二维数组各列的和。将各列和存放在一个至少7个单元的一维数组中。函数接口定义:

    本题要求实现一个函数,求一个n (小于10)行7列的二维数组各列的和.将各列和存放在一个至少7个单元的一维数组中. 函数接口定义: void fun ( int data[][7], int resu ...

  9. pta 7-3 求二维数组周边元素的累加和 (10 分)

    7-3 求二维数组周边元素的累加和 (10 分) 求一个二维数组周边元素的累加和. 输入一个二维数组的行数m(m<10),列数n(n<10),二维数组的各元素值.输出周边元素之和. 输入格 ...

最新文章

  1. usb 系统消息_4. Autoware 系统框架概揽
  2. Angular搭建框架比较好用的插件
  3. 耿美玉起诉饶毅名誉侵权,法院判了!驳回请求,但对饶毅方也应给予批评
  4. 计算机二级学那个科目,考计算机二级选哪个科目好 哪个科目简单
  5. 干掉Dubbo !这个后端开发框架就是王者!
  6. 过拟合解决方法python_机器学习之过拟合的风险
  7. Flutter基础—常用控件之图片
  8. 谈谈工业App (1)
  9. 2022 华为软件精英挑战赛 复赛思路分享
  10. 西威变频器使用说明书_西威变频器说明书西威变频器说明书图文.doc
  11. 2022年6月青少年软件编程(图形化) 等级考试试卷(二级)
  12. precede和previous_构词法词缀
  13. 概率图--贝叶斯网络、马尔可夫网络
  14. 关于LNK2000 _main 已经在 某某某.obj 中定义的问题
  15. WPF加载SVG格式的图片
  16. 坐南京13路公交车,体验《头文字D》感觉!
  17. java如何获取storage_本地化存储Storage
  18. ls-dyna基础教程
  19. Hbuilder x css样式编写无提醒
  20. 正式开赛|2023年“桂林银行杯”数据建模大赛暨全国大学生数学建模竞赛广西赛区热身赛

热门文章

  1. 关于Fragment、Tabhost和FragmentPagerAdapter来实现导航栏的效果
  2. 15.7 擦除的神秘之处
  3. oracle with check option 的作用
  4. web.xml里filter-mapping中的dispatcher作用
  5. 和我一起学 Selenium WebDriver
  6. 鲁迅散文——随感录四十九
  7. python 制作wordcloud词云
  8. spring boot+mybatis整合
  9. 一颗ARM架构芯片的软硬件构成
  10. jquery实现倒计时