C语言比较char*与char[]时strcmp出现段错误的解决方法
结论
你实现的两个字符串比较的逻辑语法是正确的:char[100]类型的nodo->fname传入strcmp时会自动退化为char*指针,和char*类型的name参数类型匹配,语法层面不存在错误。触发段错误通常是以下几个原因导致:
- 入参
name为NULL或野指针:调用search_mmap时传入的name未初始化、已被释放或值为NULL,strcmp访问非法地址触发段错误 - 入参
list *l为NULL:执行first(*l)时解引用空指针直接崩溃 - 链表
get接口返回非法指针:即使nodo内存已提前分配,也可能出现链表遍历异常、get返回野指针的情况,访问nodo->fname时触发崩溃 nodo->fname未以\0结尾:strcmp依靠字符串末尾的\0判断终止,若fname赋值时写满100个字符未预留终止符位置,strcmp会越界访问内存触发段错误- 原代码中
struct mmap_info定义末尾漏写分号,属于编译语法错误,也可能引发运行时异常
修复方案
建议补充参数校验并改用带长度限制的字符串比较函数,优化后代码如下:
#include <string.h> struct mmap_info{ char fname[100]; }; // 补全结构体定义末尾的分号 pos search_mmap(list *l, char *name){ // 入参合法性校验 if (l == NULL || name == NULL) { return NULL; } for(pos p = first(*l); !end(*l, p); p = next(*l, p)){ struct mmap_info *nodo = get(*l, p); // 校验nodo指针合法性 if (nodo == NULL) { continue; } // 用strncmp限制最大比较长度,避免fname无终止符越界 if(strncmp(nodo->fname, name, sizeof(nodo->fname) - 1) == 0){ return p; } } return NULL; }
核心修改说明
- 新增所有入参、中间指针的空指针校验,避免空指针访问崩溃
- 将
strcmp替换为strncmp,指定最大比较长度为fname数组长度减1,即使fname没有\0终止符也不会越界访问 - 补全结构体定义的分号,消除编译隐患
内容的提问来源于stack exchange,提问作者rascadux
相关产品推荐
相关产品推荐

