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

C语言二维数组初始化出现意外输出问题求助

问题分析与解决

错误根源

你调用makeIntArray2D时参数顺序搞反了,导致二维数组的维度与代码逻辑不匹配,引发数组越界访问的未定义行为,最终出现不符合预期的输出。

具体解释

makeIntArray2D函数定义中:

  • 第一个参数width是每行的元素个数(列数)
  • 第二个参数height是数组的行数

你在main里的调用是int **tohan = makeIntArray2D(3, numDisks);,当输入numDisks=9时,实际创建了一个9行3列的数组,但你的代码逻辑是把它当成3行9列来初始化、赋值和打印。这种越界访问会破坏内存中的其他数据,比如你赋值tohan[0][8] = 9时,刚好覆盖了tohan[1][0]的内存位置,所以第二行第一个元素变成了9。

修复方案

修正makeIntArray2D的调用参数顺序,将列数和行数对应正确:

int **tohan = makeIntArray2D(numDisks, 3);

修正后的完整代码示例

#include <stdio.h>
#include <stdlib.h>

void *safeMalloc(int n) {
  void *p = malloc(n);
  if (p == NULL) {
    printf("Error: malloc(%d) failed. Out of memory?\n", n);
    exit(EXIT_FAILURE);
  }
  return p;
}

int **makeIntArray2D(int width, int height) {
  int **arr = safeMalloc(height*sizeof(int *));
  for (int row=0; row < height; row++) {
    arr[row] = safeMalloc(width*sizeof(int));
  }
  return arr;
}

int main(int argc, char *argv[]) {
        int numDisks;
        int numMoves;
        scanf("%d %d", &numDisks, &numMoves);
        // 修正参数顺序:numDisks是列数,3是行数
        int **tohan = makeIntArray2D(numDisks, 3);
        for(int i = 0; i < 3; i++) {
           for(int j =0; j < numDisks; j++) {
             tohan[i][j] = 0;
           }
         }
        for(int i = 0; i < 3; i++) {
          for(int j = 0; j < numDisks; j++) {
            printf("%d ", tohan[i][j]);
          }
          printf("\n");
        }
        printf("\n");
        for(int k = 0; k < numDisks; k++) {
          tohan[0][k] = k+1;
        }
        for(int i = 0; i < 3; i++) {
          for(int j = 0; j < numDisks; j++) {
            printf("%d ", tohan[i][j]);
          }
          printf("\n");
        }
      printf("\n");
   }

运行修正后的代码,输入9 11就能得到预期输出:

0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 

1 2 3 4 5 6 7 8 9 
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 

内容的提问来源于stack exchange,提问作者MaxVK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:55:18