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

使用strcpy复制malloc生成的字符串,是否需要额外释放目标内存?

问题解答
  • strcpy 不会自动为目标指针动态分配内存,这是C标准库明确的行为要求。
  • 仅调用 free(str) 完全不够,你给出的示例代码本身就存在严重的未定义行为。

你写的第二部分代码里,char *copy; 仅声明了一个字符指针,没有给它分配任何可写的内存空间,此时copy是野指针,指向的内存地址是随机不可控的。直接调用strcpy(copy, str)会把str的内容强行写到随机地址上,轻则程序崩溃,重则会篡改其他正常运行的内存数据,出现不可预知的错误。

strcpy的核心逻辑只有一个:从源指针指向的地址开始,逐字节复制内容直到遇到字符串结束符\0为止,所有内容都会直接写入目标指针指向的内存区域,它不会做任何内存分配的操作,也不会检查目标指针是否指向了足够的有效空间,这部分校验和分配工作完全需要开发者自己实现。

正确的操作流程应该是:

  1. 先计算str中实际存储的字符串长度,手动为copy分配足够的内存(需要多分配1字节存放结束符\0)
  2. 内存分配成功后再调用strcpy执行复制
  3. 使用完两个字符串后,分别调用free释放str和copy的内存

示例正确代码:

// 原逻辑不变
char *str = malloc(sizeof(char)*10);
// 向str写入内容,注意最多写9个字符,留1位存\0

// 复制前先给copy分配内存
char *copy = malloc(strlen(str) + 1);
if (copy == NULL) {
    // 自行处理内存分配失败的场景,比如报错、释放已有资源后退出
}
strcpy(copy, str);

// 使用完两个字符串后分别释放
free(str);
free(copy);

额外补充:如果你使用的是兼容POSIX标准的运行环境,可以直接调用strdup函数完成「分配内存+复制字符串」的操作,用法如下:

char *copy = strdup(str);

注意哪怕是用strdup,用完后也需要手动调用free(copy)释放内存,它不会自动回收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:45:02