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

C语言访问字符串数组空元素触发SIGSEGV段错误如何解决

崩溃根因

你遇到的段错误完全是空指针访问导致的:

  • 你定义的char *args[MAX_CHAR]是指针数组,每个元素存储的是指向字符串的内存地址,本身不存储字符串内容。参数解析完成后,有效参数的下一个位置会被赋值为NULL(也就是你GDB里看到的0x0),不是你以为的空字符串。
  • strlen函数要求传入指向有效字符串的非空指针,你直接把NULL传给strlen,必然触发非法内存访问导致SIGSEGV。
修复方案

1. 修改parseInputFile的边界判断逻辑

把原来的空字符串判断替换为优先判空指针:

int parseInputFile(char **args, char *inputFilePath) {
    char *inputSymbol = "<";
    int isFound = 0;
    
    for (int i = 0; i < MAX_ARG; i++) {
        // 先判断指针是否为空,走到NULL说明参数已经遍历结束
        if (args[i] == NULL) {
            isFound = 0;
            break;
        }
        // 可选:如果需要跳过空字符串参数再保留这个判断
        if (strlen(args[i]) == 0) {
            continue;
        }
        if ((strcmp(args[i], inputSymbol)) == 0) {
            // 新增判空逻辑,防止<是最后一个参数时访问i+1越界
            if (args[i+1] != NULL) {
                strcpy(inputFilePath, args[i+1]);
                isFound = 1;
            }
            break;
        }
    }
    return isFound;
}

2. 可选优化:参数解析逻辑对齐规范

你当前的parseArgs逻辑已经符合UNIX类系统exec族函数的参数数组约定(最后一个元素为NULL),无需额外修改。如果担心多轮输入时数组残留旧值,可以在每次调用parseArgs前主动把args数组初始化为全NULL:

// 在processInput里调用parseArgs前加
memset(args, 0, sizeof(char*) * MAX_CHAR);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:07