C语言矩阵操作程序输入中途崩溃,遇segmentation fault求助
C矩阵程序输入阶段Segmentation Fault问题解决
问题回顾
我是C编程和指针的新手,编写了一个可接收矩阵并执行各类用户指令的程序,但运行时输入过程会中途崩溃,部分编译器提示segmentation fault (core dumped),自行调试数小时未定位问题。
原程序代码
#include <stdio.h> #include <stdlib.h> int main() { int rows, cols; int **matrix; printf("输入矩阵行数和列数:"); scanf("%d %d", &rows, &cols); // 错误:使用sizeof(int)而非sizeof(int *) matrix = (int **)malloc(rows * sizeof(int)); for (int i = 0; i < rows; i++) { matrix[i] = (int *)malloc(cols * sizeof(int)); } printf("输入矩阵元素:\n"); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { scanf("%d", &matrix[i][j]); } } // 省略其他操作代码 // 释放内存 for (int i = 0; i < rows; i++) { free(matrix[i]); } free(matrix); return 0; }
示例输入
3 3 1 2 3 4 5 6 7 8 9
问题定位
核心错误在于二维矩阵内存分配时的类型不匹配:分配行指针数组时,使用了sizeof(int)而非sizeof(int *)。在多数64位系统中,int大小为4字节,int *大小为8字节,这导致行指针数组的内存分配不足,访问时越界触发Segmentation Fault。此外,原代码未添加内存分配失败的错误处理,极端情况下也可能引发异常。
修正后的最终代码
#include <stdio.h> #include <stdlib.h> int main() { int rows, cols; int **matrix; printf("输入矩阵行数和列数:"); if (scanf("%d %d", &rows, &cols) != 2) { printf("输入格式错误\n"); return 1; } // 正确分配行指针数组:使用sizeof(int *) matrix = (int **)malloc(rows * sizeof(int *)); if (matrix == NULL) { perror("分配行指针内存失败"); return 1; } // 分配每行的元素内存 for (int i = 0; i < rows; i++) { matrix[i] = (int *)malloc(cols * sizeof(int)); if (matrix[i] == NULL) { perror("分配列元素内存失败"); // 释放已分配的内存,避免泄漏 for (int j = 0; j < i; j++) { free(matrix[j]); } free(matrix); return 1; } } printf("输入矩阵元素:\n"); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (scanf("%d", &matrix[i][j]) != 1) { printf("元素输入错误\n"); // 清理内存 for (int k = 0; k < rows; k++) { free(matrix[k]); } free(matrix); return 1; } } } // 示例操作:打印矩阵 printf("你输入的矩阵为:\n"); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } // 释放所有内存 for (int i = 0; i < rows; i++) { free(matrix[i]); } free(matrix); return 0; }
关键修正说明
- 内存分配类型修正:将
rows * sizeof(int)改为rows * sizeof(int *),确保行指针数组有足够内存存储每个行地址。 - 添加错误处理:
- 检查
scanf的返回值,确保输入格式合法 - 检查
malloc的返回值,避免空指针访问 - 内存分配失败时,释放已分配的内存,防止内存泄漏
- 检查
- 边界合法性保证:所有数组访问均在已分配的内存范围内,避免越界访问。
内容的提问来源于stack exchange,提问作者Sana Niroomand
相关产品推荐
相关产品推荐

