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

C语言字符串拼接函数内存未正常释放问题排查(不可修改main)

字符串拼接函数的错误分析与修复

你的string_cat函数存在三个关键问题,直接导致了main中free操作失败:

  • 循环条件的字符常量写错了:你用了'\\0',这完全不对。C语言里字符串的终止符是'\0',而'\\0'是非法的多字符常量,循环会因为找不到这个字符而越界访问内存,直接破坏堆的结构,最后free的时候自然会出错。
  • 内存分配少了1个字节:拼接后的字符串需要额外存一个'\0'来标记结束,但你只分配了两个原字符串长度之和的内存,写入终止符时会越界,同样会破坏堆结构。
  • 没加字符串终止符:就算内存够了,你拼完两个字符串后没手动加'\0',返回的string3不是合法的C字符串,strcmp会乱读内存,引发未定义行为,也会间接影响free的正确性。

修正后的代码如下:

char *string_cat( char const *string1, char const *string2 )
{
    int lengte1 = string_length(string1);
    int lengte2 = string_length(string2);
    // 多分配1字节给终止符
    int totaal_lengte = lengte1 + lengte2 + 1;
    char *string3 = (char*) malloc(totaal_lengte * sizeof(char));
    // 建议检查malloc是否成功,避免返回空指针
    if (!string3) {
        return NULL;
    }
    int i = 0;
    int j = 0;
    // 修正循环条件为正确的'\0'
    while(string1[i] != '\0'){
        string3[j] = string1[i];
        i++;
        j++;
    }
    i = 0;
    while(string2[i] != '\0'){
        string3[j] = string2[i];
        i++;
        j++;
    }
    // 添加字符串终止符
    string3[j] = '\0';
    return string3;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:57:17