如何用指针访问malloc创建的二维数组?代码错误处理是否正确?
嘿,我来帮你搞定这两个问题——用纯指针操作访问二维数组元素,还有那段错误处理的正确性问题。
用指针访问二维数组元素
你完全可以通过指针算术来替代data[i][j]的写法。其实data[i][j]本身就是*(*(data + i) + j)的语法糖,直接用这个指针表达式就能访问对应元素。
我把你代码里的赋值和打印循环改成纯指针版本,你可以参考:
// 赋值循环 for(int i=0;i<x;i++){ for(int j=0;j<y;j++){ *(*(data + i) + j) = (i+1)*(j+1); } } // 打印循环 for(int i=0;i<x;i++){ for(int j=0;j<y;j++){ printf("%3i ", *(*(data + i) + j)); } printf("\n"); }
如果你想更彻底地用单指针遍历,要注意:因为你的二维数组是逐行malloc分配的(不是连续的一块内存),所以没法直接用一个指针从头走到尾,上面这种逐行用指针算术的方式是最直接的替代方案。
错误处理的正确性分析
你那段if(!**data)的错误处理完全不正确,还非常危险!
原因很简单:当你执行int **data = (int**) malloc(x * sizeof(int));后,哪怕malloc成功了,data指向的数组里的每个int*都是未初始化的垃圾值。**data相当于先取data[0](这个垃圾指针),再解引用它访问内存——这属于未定义行为,可能直接导致程序崩溃,或者读取到随机值,根本没法用来判断malloc是否成功。
正确的错误处理应该直接检查data本身是否为NULL(因为malloc失败时会返回NULL):
// 这里还要注意:你原来的sizeof(int)写错了,应该是sizeof(int*) int **data = (int**) malloc(x * sizeof(int*)); if(!data){ printf("Error allocating row pointers\n"); return 1; }
补充个小细节:你原来代码里的malloc(x * sizeof(int))是不规范的,data是int**类型,需要分配的是x个int*的空间,所以应该用sizeof(int*)——虽然很多系统里int和int*大小相同,但这属于依赖平台的写法,容易出问题。
内容的提问来源于stack exchange,提问作者Patryk Korczak
相关产品推荐
相关产品推荐

