C语言中对malloc分配后赋值为字面量的字符串执行strcat出现段错误如何解决
问题根源
你提供的代码存在两个核心错误,直接导致程序运行异常:
- 指针赋值逻辑错误:
John = "John"这种写法不是把字符串内容拷贝到malloc申请的堆空间里,而是直接让John指针指向了只读数据段的字符串常量地址,原本malloc得到的堆地址直接丢失,还会导致后续strcat尝试向只读内存写入数据,直接触发段错误。 - 目标缓冲区空间不足:就算你正确把内容拷贝到堆空间,你给
John申请的4字节只能刚好放下"John"(含末尾\0结束符),没有预留拼接Carter所需的额外空间,也会导致越界写入触发未定义行为。
可行替代方案
方案1:保留malloc用法,修正拷贝逻辑+申请足够空间
优先推荐这种兼容性最高的方案,只需修正拷贝逻辑、提前计算申请足够的缓冲区大小即可:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { // 申请总空间:"John"长度4 + "Carter"长度6 + 1个结束符,共11字节 char* John = malloc(4 + 6 + 1); char* Carter = malloc(7); // 用strcpy把字符串内容拷贝到堆空间,不要直接给指针赋值字符串常量 strcpy(John, "John"); strcpy(Carter, "Carter"); strcat(John, Carter); printf("%s\n", John); // 用完记得释放malloc申请的内存,避免内存泄漏 free(Carter); free(John); return 0; }
如果拼接的字符串长度不固定,可以先用strlen分别计算两个字符串的长度后再申请对应大小的空间,避免空间不足或者浪费。
方案2:使用asprintf自动分配空间(POSIX环境可用)
如果运行环境符合POSIX标准(Linux、macOS、部分嵌入式环境等),可以用asprintf自动计算所需空间、自动申请堆内存,不需要手动计算长度:
#include <stdio.h> #include <stdlib.h> int main(void) { char* John = "John"; char* Carter = "Carter"; char* res; // 自动申请对应大小的空间存储拼接结果 asprintf(&res, "%s%s", John, Carter); printf("%s\n", res); free(res); return 0; }
内容的提问来源于stack exchange,提问作者user6833628
相关产品推荐
相关产品推荐

