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

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


错误原因

  1. 变量未初始化导致数组越界:n未赋予初始值,默认是栈上的随机垃圾值,访问old[n]时大概率超出数组下标范围(old下标仅能为0-8),触发段错误。
  2. 编译命令错误:gcc >array.c -o array中的>会将gcc输出重定向到array.c,直接清空源文件,正确编译命令应为gcc array.c -o array。
  3. 字符与数字混淆: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:15:38