C语言中动态二维数组(矩阵)行数大于列数时崩溃求助
C语言动态二维数组行数大于列数时崩溃的解决方法
你的代码崩溃的核心原因是行指针分配的循环条件错误:
你用calloc申请了r个int*类型的行指针,但后续给行指针分配列空间时,循环条件写成了i < c,这就导致只有前c个行指针被正确分配了内存。当行数r大于列数c时,第c到r-1个行指针都是calloc初始化的空指针(NULL),后续访问a[i][j]时就会触发空指针解引用,直接导致程序崩溃。
修正后的完整代码
// 创建自定义大小的矩阵、输入元素并显示内容 #include<stdio.h> #include<stdlib.h> void display(int**, int, int); int main() { int **a, r, c, i, j; printf("输入矩阵的行数\n"); scanf("%d", &r); printf("输入矩阵的列数\n"); scanf("%d", &c); // 分配r个行指针 a = (int**)calloc(r, sizeof(int*)); // 循环条件改为i < r,为每一行分配列空间 for(i = 0; i < r; i++) { a[i] = (int*)calloc(c, sizeof(int)); } printf("输入矩阵元素\n"); for(i = 0; i < r; i++) { for(j = 0; j < c; j++) { printf("输入元素(%d,%d)\n", i+1, j+1); scanf("%d", &a[i][j]); } } printf("矩阵内容:\n"); display(a, r, c); // 补充:手动释放动态分配的内存,避免内存泄漏 for(i = 0; i < r; i++) { free(a[i]); } free(a); return 0; } void display(int **arr, int r, int c) { int i, j; for(i = 0; i < r; i++) { for(j = 0; j < c; j++) { printf("%d\t", arr[i][j]); } printf("\n"); } }
关键修正点
- 将行指针分配的循环条件从
i < c改为i < r,确保每一行都能得到对应的列内存空间。 - 补充了内存释放代码,养成手动回收动态内存的规范习惯(虽然程序结束后系统会自动回收,但手动释放能避免长期运行时的内存泄漏问题)。
内容的提问来源于stack exchange,提问作者Lost One
相关产品推荐
相关产品推荐

