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

