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

