You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么scanf没有将输入整数存储到动态二维数组的正确位置?

问题核心原因

你出错的根本原因是混淆了「指向二维数组的指针」的访问语法,运算符优先级和指针步长的共同作用导致了内存访问偏移:

  1. 首先明确类型定义:typedef int myMatrix[ROW_SIZE][COL_SIZE]; 声明的myMatrix是「2行6列的int二维数组」类型,因此myMatrix *pMatrix是指向完整二维数组的指针,不是二级指针,也不是二维数组本身。
  2. 你原来的写法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列元素的地址
  • 对应你的循环逻辑:
    • 第一次循环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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:45:03