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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:18:03