C语言中zsh: segmentation fault成因与解决,程序报错排查
C程序段错误问题排查与修复
编写的C程序运行时触发zsh: segmentation fault错误,代码及运行命令如下:
#include<stdio.h> int main() { int old[9]={'3','5','7','8','8','6','2','3','5'}; int new[3][3], r, c, n; for (r=0;r<3;r++){ for (c=0;c<3;c++){ new[r][c]=old[n]; n++; } } printf("New array is:\n"); for (r=0;r<3;r++){ for (c=0;c<3;c++){ printf("%d",new[r][c]); } printf("\n"); } }
运行错误输出:
┌──(imsourobh㉿kali)-[~/Documents/codes/c/cse]
└─$ cd "/home/imsourobh/Documents/codes/c/cse/" && gcc >array.c -o array && "/home/imsourobh/Documents/codes/c/cse/"array
zsh: segmentation fault "/home/imsourobh/Documents/codes>c/cse/"array
错误原因
- 变量未初始化导致数组越界:
n未赋予初始值,默认是栈上的随机垃圾值,访问old[n]时大概率超出数组下标范围(old下标仅能为0-8),触发段错误。 - 编译命令错误:
gcc >array.c -o array中的>会将gcc输出重定向到array.c,直接清空源文件,正确编译命令应为gcc array.c -o array。 - 字符与数字混淆:
old数组存储的是字符常量(如'3'),用%d输出会打印其ASCII码(51),而非预期的数字3。
修改后的代码
#include<stdio.h> int main() { // 存储整数而非字符,避免ASCII码输出问题 int old[9]={3,5,7,8,8,6,2,3,5}; int new[3][3], r, c, n = 0; // 初始化n为0,确保从数组首元素开始遍历 for (r=0;r<3;r++){ for (c=0;c<3;c++){ new[r][c]=old[n]; n++; } } printf("New array is:\n"); for (r=0;r<3;r++){ for (c=0;c<3;c++){ printf("%d ",new[r][c]); // 加空格分隔元素,提升可读性 } printf("\n"); } return 0; // 符合C标准main函数返回值规范 }
修改说明
- 初始化
n为0,确保数组下标访问合法。 - 将
old数组的字符常量改为整数,输出直接显示数字。 - 输出时添加空格分隔元素,优化显示效果。
- 补充
return 0;,符合C语言标准规范。 - 编译命令修正为
gcc array.c -o array,执行./array即可正常运行。
内容的提问来源于stack exchange,提问作者imsourobh
相关产品推荐
相关产品推荐

