是否可以使用C的strcpy复制一个字符串,而不首先将内存分配给char *character_array?基本上,是这样的可能性:
strcpy
char *character_array
strcpy(char *my_string, another_string);
其中,my_string成为与another_string具有相同长度和内容的初始化字符串。
my_string
another_string
hc2pp10m1#
strcpy从不分配内存。目标必须是指向足够的、可写的、有效分配的内存的指针,并且 * 您 * 负责确保目标内存是有效分配的、足够长的、可写的。这些都是好的:
char *another_string = "hello"; char my_string_1[20]; strcpy(my_string_1, another_string); /* valid (plenty of space) */ char my_string_2[6]; strcpy(my_string_2, another_string); /* valid (just enough space) */ char my_string_3[] = "world"; strcpy(my_string_2, another_string); /* valid (just enough space) */ char buf[6]; char *my_string_4 = buf; strcpy(my_string_4, another_string); /* valid (via intermediate pointer) */ char *my_string_5 = malloc(6); strcpy(my_string_5, another_string); /* valid (assuming malloc succeeds) */ char *my_string_6 = malloc(strlen(another_string) + 1); strcpy(my_string_6, another_string); /* valid (assuming malloc succeeds) */
但这些都是无效的:
char my_string_7[5]; strcpy(my_string_7, another_string); /* INVALID (not enough space) */ char *my_string_8 = "world"; strcpy(my_string_8, another_string); /* INVALID (destination not writable) */ char *my_string_9; strcpy(my_string_9, another_string); /* INVALID (destination not allocated) */ char *my_string_10 = malloc(20); free(my_string_10); strcpy(my_string_10, another_string); /* INVALID (no longer allocated) */ char *exceptionally_bad_allocator() { char local_buffer[20]; return local_buffer; } char *my_string_11 = exceptionally_bad_allocator(); strcpy(my_string_11, another_string); /* INVALID (not validly allocated) */
6vl6ewon2#
使用strcpy是不可能的,但可以编写自己的函数
//if buff is NULL then it will allocate memory for it. char *strcpyalloc(char *buff, const char *src) { size_t len; if(!buff) // if not allocated allocate { len = strlen(src) + 1; buff = malloc(len); if(buff) { memcpy(buff, src, len); } } else strcpy(buff, src); return buff; } int main(void) { char *str = NULL; str = strcpyalloc(str, "Hello World!"); if(str) printf("\"%s\"\n", str); free(str); }
https://godbolt.org/z/Me4GEr5dP
ndh0cuux3#
当支持可变长度数组VLA时,代码可以创建大小合适的空间,该空间有效 * 直到块的末尾 *。
{ char my_string[strlen(another_string) + 1]; strcpy(my_string, another_string); ... // No need to free `my_string` }
3条答案
按热度按时间hc2pp10m1#
strcpy
从不分配内存。目标必须是指向足够的、可写的、有效分配的内存的指针,并且 * 您 * 负责确保目标内存是有效分配的、足够长的、可写的。这些都是好的:
但这些都是无效的:
6vl6ewon2#
使用
strcpy
是不可能的,但可以编写自己的函数https://godbolt.org/z/Me4GEr5dP
ndh0cuux3#
当支持可变长度数组VLA时,代码可以创建大小合适的空间,该空间有效 * 直到块的末尾 *。