为什么scanf没有将输入整数存储到动态二维数组的正确位置?
问题核心原因
你出错的根本原因是混淆了「指向二维数组的指针」的访问语法,运算符优先级和指针步长的共同作用导致了内存访问偏移:
- 首先明确类型定义:
typedef int myMatrix[ROW_SIZE][COL_SIZE];声明的myMatrix是「2行6列的int二维数组」类型,因此myMatrix *pMatrix是指向完整二维数组的指针,不是二级指针,也不是二维数组本身。 - 你原来的写法
pMatrix[i][j]的实际运算逻辑:- C语言中
[]运算符优先级高于解引用*,pMatrix[i]等价于*(pMatrix + i),因为pMatrix是指向整个二维数组的指针,步长为2*6*sizeof(int),i对应的是「第i个二维数组」的偏移 - 在此基础上的
pMatrix[i][j]等价于(*(pMatrix + i))[j],得到的是「第i个二维数组的第j行的首地址」,而不是你以为的第i行第j列元素的地址
- C语言中
- 对应你的循环逻辑:
- 第一次循环
i=0, j=0:pMatrix[0][0]就是第0个二维数组的第0行首地址,刚好等于&(*pMatrix)[0][0],所以写入正常 - 第二次循环
i=0, j=1:pMatrix[0][1]是第0个二维数组的第1行首地址,刚好等于&(*pMatrix)[1][0],所以值存到了[1][0]的位置 - 当
j >= 2时,pMatrix[0][j]已经超出了你分配的2行二维数组的合法范围,直接写入到了数组外的内存,就出现了后续值丢失的问题
- 第一次循环
修复方案
不需要临时变量也可以直接用scanf写入,只要正确取到对应元素的地址即可:
scanf("%d", &(*pMatrix)[i][j]);
运算逻辑:先对pMatrix解引用得到二维数组本身,再用[i][j]定位到对应元素,最后取地址传给scanf,和你用临时变量赋值的(*pMatrix)[i][j] = temp逻辑完全一致。
另外你的malloc写法可以优化得更易读,直接用类型的大小即可,避免手动计算出错:
myMatrix *pMatrix = (myMatrix *)malloc(sizeof(myMatrix));
内容的提问来源于stack exchange,提问作者chaoticnull
相关产品推荐
相关产品推荐

