C语言程序为何触发SIGSEGV无效内存访问错误?
错误原因
- 直接诱因是未对输入参数做合法性校验:如果调用
welcome时传入的language是NULL空指针,strcmp会尝试访问空指针指向的内存,直接触发非法内存访问,抛出SIGSEGV信号。 - 若排除空指针问题,还要检查传入的
language是否是合法的、以\0结尾的C风格字符串,否则strcmp会越界遍历内存,也会触发段错误。 - 潜在代码规范问题:结构体
options的两个成员指向字符串字面值(只读内存),未加const修饰,后续如果误修改会触发未定义行为。
修复方案
首先在比较前添加空指针校验,补全头文件引入,优化类型声明,修复后代码如下:
// 显式引入strcmp对应的头文件,避免部分编译器隐式声明引发异常 #include <string.h> const char *welcome(const char *language) { struct options { // 加const匹配字符串字面值的只读属性 const char *language; const char *greeting; }; const struct options list[17] = { {"english", "Welcome"}, {"czech","Vitejte"}, {"danish","Velkomst"}, {"dutch","Welkom"}, {"estonian","Tere tulemast"}, {"finnish","Tervetuloa"}, {"flemish","Welgekomen"},{"french","Bienvenue"}, {"german","Willkommen"},{"irish","Failte"}, {"italian","Benvenuto"},{"latvian","Gaidits"}, {"lithuanian","Laukiamas"},{"polish","Witamy"}, {"spanish","Bienvenido"},{"swedish","Valkommen"}, {"welsh","Croeso"} }; // 新增空指针校验,为空直接返回默认问候语 if (language == NULL) { return "Welcome"; } for (int i = 0; i < 17; i++) { if (strcmp(language, list[i].language) == 0) { return list[i].greeting; } } return "Welcome"; }
内容的提问来源于stack exchange,提问作者programmerc3981143
相关产品推荐
相关产品推荐

