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

简短C语言代码出现Segmentation Fault(段错误),求故障原因

为什么这段C代码会触发Segmentation Fault(段错误)?

这个段错误的原因其实挺直观的,咱们一步步拆解代码里的问题:

1. 未初始化/错误的数组维度导致内存越界

你代码里的row_num初始化为0,col_num甚至没初始化(是随机的垃圾值),然后用这俩变量定义了变长数组(VLA):

int end_matrix[row_num][col_num];

这就导致数组的大小要么是0(因为row_num=0),要么是完全不确定的垃圾尺寸。但后面的循环却用row_max=10000和col_max=10000作为边界去访问数组:

for(int row=0;row!=row_max;row++){
    for(int column=0;column!=col_max;column++){
        end_matrix[row][column] = row*column;
    }
}

这种明显的内存越界访问直接触发了段错误——你在访问不属于这个数组的内存区域,操作系统会直接终止程序。

2. 超大数组导致栈空间溢出

就算你把row_num和col_num都设成10000,这个二维数组的大小是10000*10000=10^8个int,按每个int占4字节算,总大小是400MB。而程序的栈空间通常只有几MB(比如Linux默认是8MB),这么大的数组放在栈上直接撑爆栈空间,同样会触发段错误。

3. 逻辑不一致的循环边界

你的循环用row_max和col_max作为终止条件,但数组的维度却是row_num和col_num,这两个变量完全没有关联。就算row_num和col_num是有效值,只要和row_max/col_max不相等,要么会越界访问,要么会浪费数组空间,逻辑上完全站不住脚。


修复建议

  • 先正确初始化数组维度:确保row_num和col_num在定义数组前被赋值,并且和循环的边界保持一致,比如把循环里的row_max/col_max换成row_num/col_num。
  • 用堆内存代替栈内存:对于超大数组,必须用动态分配的方式在堆上创建,比如:
    // 动态分配二维数组
    int **end_matrix = malloc(row_num * sizeof(int*));
    for(int i=0; i<row_num; i++){
        end_matrix[i] = malloc(col_num * sizeof(int));
    }
    // 使用完成后记得释放内存
    for(int i=0; i<row_num; i++){
        free(end_matrix[i]);
    }
    free(end_matrix);
    
  • 修正换行符的写法:fprintf(f," "); 这种写法是错误的,应该改成fprintf(f, "\n");,否则编译会报错。

内容的提问来源于stack exchange,提问作者user11204916

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:41:37