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

重复比较字符串返回错误值:C语言结构体字符串拷贝异常排查

问题分析与解决

核心问题:字符串数组空间不足,缺少终止符

C语言字符串必须以'\0'(空字符)作为结束标志,你代码里的两处数组定义都存在空间不足的问题:

  • 结构体中的char eth[4]
  • char buffer[4] = "eth1"

这两个数组长度仅为4,刚好只能放下'e'、't'、'h'、'1'4个字符,完全没有空间存储字符串结束符'\0'。这会引发一系列异常:

  • strcpy拷贝时会越界写入,破坏相邻内存(比如后续结构体的成员)
  • strlen、strcmp这类依赖'\0'的函数会读取超出数组范围的内存,行为不可预测
  • 第一次循环时,static类型数组默认初始化为全0,obj[0].eth是合法空字符串,strcmp能匹配;但拷贝后越界的'\0'可能刚好存在于内存中,后续循环因内存被之前的越界操作破坏,无法正确识别字符串。

修复步骤

  1. 增大数组长度:把结构体的eth数组和buffer数组长度改为5,留出存储'\0'的空间:
    typedef struct interface_data {
        char eth[5];  // 改为5,容纳"eth1" + '\0'
        int  cnt;
    } interface;
    
    // 主函数内的buffer同步修改
    char buffer[5] = "eth1";
    
  2. 移除多余的终止符赋值:代码里的obj[i].eth[len] = '\0';完全多余,甚至可能越界。strcpy在源字符串合法(带'\0')的情况下,会自动将'\0'拷贝到目标数组中。
  3. 可选优化:无需buffer变量,直接用strcpy(obj[i].eth, "eth1");更简洁,避免额外变量的潜在问题。

修复后的完整代码

typedef struct interface_data {
    char eth[5];
    int  cnt;
} interface;

int main()
{
    static interface obj[3];
    int i = 0;
    int len;
    char buffer[5] = "eth1";
    for(i = 0 ; i < 3; i++){
        if(strcmp(obj[i].eth,"") == 0)
            printf("yes\n");
        strcpy(obj[i].eth,buffer);
        len = strlen(obj[i].eth);
        printf("%d len of string\n",len);
        obj[i].cnt = i;
        len = strcmp(obj[i].eth,"eth1");
        if(len == 0)
            printf("true\n");
        else
            printf("\n%d wrong data\n",len);
    
        char *p = obj[i].eth;
        while(*p != '\0') {
            printf("%c\t",*p);
            p++;
        }
        printf("\ndata %s and cnt %d\n",obj[i].eth,obj[i].cnt);
    }
    
    return 0;
}

补充说明

  • static修饰的全局/局部数组会被默认初始化为全0,所以第一次循环时obj[0].eth是合法空字符串;但非static的局部数组不会初始化,内部是随机值,此时用strcmp和""比较会触发异常。
  • 字符串操作必须确保目标数组有足够空间容纳源字符串(包括'\0'),否则会触发未定义行为,程序可能崩溃、输出异常结果,或在不同环境下表现不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:48:22