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

