可以在strcpy中创建字符数组吗?

yyyllmsg  于 2023-03-29  发布在  其他
关注(0)|答案(3)|浏览(80)

是否可以使用C的strcpy复制一个字符串,而不首先将内存分配给char *character_array
基本上,是这样的可能性:

strcpy(char *my_string, another_string);

其中,my_string成为与another_string具有相同长度和内容的初始化字符串。

hc2pp10m

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) */
6vl6ewon

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

ndh0cuux

ndh0cuux3#

当支持可变长度数组VLA时,代码可以创建大小合适的空间,该空间有效 * 直到块的末尾 *。

{
  char my_string[strlen(another_string) + 1];
  strcpy(my_string, another_string);
  ...
  // No need to free `my_string`
}

相关问题