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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:36:08