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
相关产品推荐
相关产品推荐

