C语言大尺寸多维数组出现segmentation fault (core dump)原因求解
段错误原因分析
导致程序在d较大时出现segmentation fault的核心原因如下:
- 命令缓冲区溢出:你定义的
MAX_LENGHT值为5,command仅分配了5字节内存。AddM本身占4个字符,加上字符串必须的末尾结束符\0刚好占满5字节,一旦输入的命令长度超过4,就会发生缓冲区溢出,覆盖相邻内存数据,触发非法访问。同时你使用无长度限制的scanf("%s", command),进一步放大了溢出风险。 - 二维矩阵内存释放不完整:你为二维矩阵分配内存时,先为d个指针分配了空间,又为每个指针单独分配了d个int的存储空间,但程序结束时仅调用了
free(m),所有m[i]指向的内存块都没有被释放。当d较大时,多次执行AddM指令会导致严重的内存泄漏,最终触发内存分配失败。 - 无内存分配返回值检查:所有
malloc调用(包括矩阵内存、command内存的分配)都没有判断返回值是否为NULL。当d过大、系统无法提供足够内存时,malloc会返回NULL,后续直接对NULL指针解引用就会触发段错误。 - 无错误返回值判断:
buildAdjMat在输入异常时会返回NULL,但你没有对该返回值做校验,后续打印矩阵时直接访问NULL指针也会触发段错误。
修复建议
// 1. 扩大命令缓冲区大小 #define MAX_LENGHT 32 // 2. 所有malloc后增加返回值判断,示例: m = (int **)malloc(d * sizeof(int *)); if (m == NULL) { perror("malloc failed"); exit(1); } for (i = 0; i < d; i++) { m[i] = (int *)malloc(d * sizeof(int)); if (m[i] == NULL) { perror("malloc failed"); exit(1); } } // 3. 修改scanf限制输入长度,避免溢出: scanf("%31s", command); // 4. 释放矩阵时先释放每行内存,再释放一级指针: for (i = 0; i < d; i++) { free(m[i]); } free(m); // 5. 校验buildAdjMat返回值: m = buildAdjMat(m); if (m == NULL) { printf("输入矩阵失败\n"); // 执行资源释放逻辑后退出 exit(1); }
内容的提问来源于stack exchange,提问作者mmanu
相关产品推荐
相关产品推荐

