如果复制从 malloc 生成的字符串,是否需要从 'strcpy' 中释放一个字符串?

Do you need to free a string from 'strcpy' if you copy a string generated from malloc?

假设我有一些代码片段

char *str = malloc(sizeof(char)*10)
// some code to add content to the string in some way

创建 10 个字符的字符串。如果我然后将 strstrcpy 从标准字符串库复制到一个新变量中,例如

char *copy;
strcpy(copy, str);

我知道我需要使用 free(str) 来释放 str,但这就够了吗?或者 strcpy 如果用于从 malloc 创建的字符串,是否也为 copy 动态分配内存?

Or does strcpy also dynamically allocate memory for copy

不,strcpy 对内存一无所知,因此您的代码将字符串复制到指向 la-la land 的未初始化指针中。

如果你想在同一个调用中分配 + 复制,有非标准的 strdup(看起来它将在下一版本的语言中添加到 C 标准中)。

或者只执行 char *copy = malloc(strlen(str)+1); 然后 strcpy。请记住始终为空终止符留出空间。

strcpy 不分配,因此您的第二个代码段无效,除非 copy 是用某个缓冲区初始化的(无论它是堆栈分配还是堆分配)或者是一个足够大的数组。

旁注:如果您不知道源字符串的确切长度,您需要确保目标缓冲区大小不超过(例如,通过使用 strncpy 或提供足够大的目标缓冲区).

我想 documentation 应该详细回答你的问题。

对于初学者来说,指针副本未初始化

char *copy;

所以strcoy的这个调用

strcpy(copy, str);

导致未定义的行为。

指针copy必须指向一个字符数组,指针str指向的字符串将被复制到该数组中。

您需要释放使用 malloc、calloc 或 realloc 分配的内容。

因此,如果指针副本指向的目标数组是动态分配的,例如

char *copy = malloc( 10 * sizeof( char ) );

那么当不再需要分配的内存时,您当然需要释放它。

这与仅将字符串从一个字符数组复制到另一个字符数组的函数 strcpy 没有任何共同之处。