简短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
相关产品推荐
相关产品推荐

