使用switch处理Shell内置命令时出现Segmentation fault问题求助
问题原因&修复方案
核心问题出在hsh_execute函数的两个逻辑疏漏:
内置命令字符串数组无终止哨兵,导致for循环越界访问
你当前定义的builtin_str数组仅包含3个有效字符串元素,没有显式添加NULL作为结束标记,C语言不会自动给这种初始化的数组补NULL。你的for循环判断条件为builtin_str[i],当i等于3时会访问数组外的内存,属于未定义行为,可能触发非法内存访问导致段错误。你之前用函数指针实现的版本大概率是加了NULL哨兵,所以没有这个问题。未做空输入校验直接访问
args[0]
如果用户输入空行,tokenize函数返回的args数组的第一个元素args[0]会是NULL,你直接传入strcmp会触发非法指针访问,导致段错误。
修复后代码
int hsh_execute(char **args) { int i = 0; // 新增空输入校验 if (args == NULL || args[0] == NULL) { return 1; } // 数组末尾添加NULL作为哨兵 char *builtin_str[] = { "cd", "help", "exit", NULL }; for (i = 0; builtin_str[i]; i++) { if (strcmp(builtin_str[i], args[0]) == 0) break; } switch (i) { case 0: hsh_cd(args); break; case 1: hsh_help(); break; case 2: hsh_exit(); break; default: launch_child(args); break; } return 1; }
如果修改后仍有问题,可以检查hsh_cd函数是否处理了不带参数的cd场景,避免访问args[1]时出现空指针解引用。
内容的提问来源于stack exchange,提问作者seahorse-code
相关产品推荐
相关产品推荐

