关于C语言二维数组多层指针访问代码失效的技术问询
问题:二维数组访问代码无法运行的原因分析
代码示例
int main() { int i = 0; int array[2][2] = { {1,2} , {3,4}}; for(int j = 0; j<2; j++) { for(int k = 0; k < 2;k++) { printf("%d", *(*(*(array+i)+j)+k)); } printf("\n"); } }
用户思路
我的思路是:尝试访问第i个二维数组(i值为0,因仅定义了一个二维数组),再访问该二维数组的第j个一维数组,最后访问该一维数组的第k个元素。
错误原因分析
指针解引用层级错误
array是int[2][2]类型的二维数组,隐式转换后是int (*)[2](指向含2个int的数组的指针):*(array+i)等价于array[0],是int[2]类型的一维数组,再次隐式转换为int*指针;*(array+i)+j等价于array[0]+j,是指向array[0][j]的int*指针;- 此时你多做了一次
*,得到array[0][j](一个int整数),后续+k变成整数加法,最后对这个整数解引用*,属于对非指针值的非法解引用,触发未定义行为(程序崩溃或异常)。
循环逻辑与访问逻辑不匹配
你的循环用j遍历行、k遍历列,但访问表达式里固定用i=0指向第一行,即便指针操作正确,也只会重复访问第一行元素,不符合遍历整个数组的预期。
修正方案
将访问表达式改为*(*(array+j)+k),或者更直观的array[j][k],修正后的代码如下:
int main() { int array[2][2] = { {1,2} , {3,4}}; for(int j = 0; j<2; j++) { for(int k = 0; k < 2;k++) { printf("%d ", array[j][k]); } printf("\n"); } }
内容的提问来源于stack exchange,提问作者Chrizy_Ch
相关产品推荐
相关产品推荐

