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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:27:00