如果复制从 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 个字符的字符串。如果我然后将 str
和 strcpy
从标准字符串库复制到一个新变量中,例如
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
没有任何共同之处。
假设我有一些代码片段
char *str = malloc(sizeof(char)*10)
// some code to add content to the string in some way
创建 10 个字符的字符串。如果我然后将 str
和 strcpy
从标准字符串库复制到一个新变量中,例如
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
没有任何共同之处。