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

C语言使用strcmp函数触发段错误问题排查求助

段错误触发原因及修复方案

1. 字符串数组哨兵设计错误

你当前用"\0"字符串作为keywords数组的终止标记是错误的。字符串数组的遍历哨兵应该是NULL空指针,而不是指向空字符串的有效指针。当前你的keywords数组只有3个元素,当循环变量i超过2之后,sarr[i]访问的就是数组边界外的野内存,把野指针传给strcmp会直接触发段错误。

  • 修复方案:
    把keywords的定义改成char* keywords[] = {"int", "return", NULL};,同时把str_in_arr里的while循环条件改成while(sarr[i] != NULL),不需要用strcmp判断空字符串当终止条件。

2. 局部数组指针逃逸错误

lexer.c里的wrd是循环内部的栈上局部数组,你直接执行tokens[toki].value = wrd,当这一轮循环结束后,wrd的内存就会被释放回收,后续访问tokens[x].value都是访问野指针,你代码里的printf("%s\n", tokens[toki].value)就会触发非法内存访问。

  • 修复方案:给value分配堆内存,比如用tokens[toki].value = strdup(wrd),使用完后记得free避免内存泄漏。

3. 字符串未补空终止符

你在读取字符填充wrd的循环结束后,没有手动添加'\0'终止符,导致wrd不是合法的C字符串,传给strcmp时函数会越界访问内存找终止符,触发段错误。

  • 修复方案:在填充wrd的while循环结束后,加一行wrd[i] = '\0'。

4. 数组越界判断逻辑错误

wrd的长度是256,有效下标范围是0~255,你当前的判断条件是if(i > 256)才报错,当i等于256时已经发生了缓冲区溢出,会破坏栈上的其他数据。

  • 修复方案:把判断条件改为if(i >= 256)。

5. 未初始化内存访问错误

你在toki++之后直接打印tokens[toki].value,这个下标的token还没有被初始化,value是野指针,直接printf也会触发段错误。

  • 修复方案:要么先初始化所有token的value为NULL,要么只打印已经完成赋值的下标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:54:04