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

求助:这段C代码为何出现segmentation fault(段错误)?

C程序段错误问题分析与修复

问题根源

段错误的直接原因是未检查命令行参数是否传入就使用argv[1]:

  • 当运行程序时未提供文件名参数,argv[1]的值为NULL(对应valgrind提示的Address 0x0),strcpy尝试从NULL地址读取数据,直接触发段错误。
  • OnlineGDB中出现文件未打开的提示,是因为你当时传入了参数,但指定的文件不存在,属于fopen调用失败的场景,和本地的段错误是两种不同运行情况。调整fileName数组大小无济于事,因为问题根本不在数组容量,而是源指针为空。

修复步骤

  1. 先检查命令行参数数量:在使用argv[1]前,判断argc是否大于1(argc表示命令行参数总数,程序自身文件名算第一个参数,传入文件名后argc至少为2):
int main(int argc, char *argv[]) 
{
    char fileName[50] = {};
    char fileLine[200] = {};
    char *token = NULL;
    char *delimiters = " \n\t";
    FILE *FH = NULL;

    // 检查是否传入文件名参数
    if (argc < 2)
    {
        printf("请传入文件名作为命令行参数\nExiting...");
        exit(1);
    }

    //step 1e to 1g
    strcpy(fileName, argv[1]);
    FH = fopen(fileName, "r+");
    if (FH == NULL)
    {
        printf("File did not open\nExiting...");
        exit(0);
    }
    // 后续代码...
}
  1. 避免缓冲区溢出风险:strcpy不检查目标数组容量,如果传入的文件名过长会破坏栈数据,建议改用strncpy并手动添加终止符:
strncpy(fileName, argv[1], sizeof(fileName)-1);
fileName[sizeof(fileName)-1] = '\0'; // 确保字符串以'\0'结尾

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:08:24