为什么使用双指针为矩阵分配内存?对应代码逻辑如何理解
问题1:为什么使用双指针而非单指针完成内存分配
这段代码的核心目的是实现动态长度的二维整型数组,选择双指针方案的原因如下:
- 双指针方案支持直接用
arr[i][j]的形式访问二维数组元素,符合常规的数组访问习惯,代码可读性远高于单指针方案的arr[i*c +j]偏移访问写法 - 双指针方案支持实现锯齿数组(各行长度可以独立设置,不需要所有行长度一致),单指针连续内存的方案无法支持这种需求
- 当需要分配的二维数组容量较大时,单指针方案要求整块内存连续,容易因为系统内存碎片化分配失败;双指针方案只要求单行内存连续,行与行之间不需要连续,分配成功率更高
问题2:代码逐行实现逻辑解释
你给出的是C语言标准的动态二维数组分配代码,逐行逻辑如下:
第一行:分配外层指针数组
int **arr = malloc(l * sizeof(int *));
int **arr定义了一个二级整型指针,用来指向一组int*类型的指针元素malloc(l * sizeof(int *))向系统申请了长度为l的int*类型内存空间,也就是可以存储l个一级指针的数组,这l个指针后续会分别指向二维数组每一行的首地址- 将申请到的指针数组首地址赋值给
arr,后续通过arr[i]就能访问到指针数组的第i个元素,也就是第i行的首地址
第二到第三行:循环分配每行的元素存储空间
for (i=0; i<l; i++) arr[i] = (int *)malloc(c * sizeof(int));
- 外层循环遍历指针数组的每个位置
arr[i],从第0行到第l-1行依次分配内存 - 每次循环中
malloc(c * sizeof(int))申请了可以存储c个整型元素的内存空间,作为二维数组的第i行 - 这里的
(int *)强制类型转换在标准C中可以省略,malloc返回的void*指针会自动隐式转换为对应类型的指针,保留也不会影响编译运行
补充注意:动态申请的二维数组使用完毕后需要按「先释放行、再释放外层指针数组」的顺序回收内存,避免内存泄漏:
for(i=0; i<l; i++) free(arr[i]); free(arr);
内容的提问来源于stack exchange,提问作者Marwane
相关产品推荐
相关产品推荐

