此代码是否正确?如果是,则 malloc 已经将地址分配给 name[i] 变量,那么为什么使用 strcpy?

is this code correct?If yes then malloc is already assigning the addresses to name[i] variable then why strcpy is used?

下面是一段代码

 char str[20];
 char *name[5];
 for(i=0;i<5;i++){
     printf("Enter a string");
     gets(str);
     name[i]=(char *)malloc(strlen(str));
     strcpy(name[i],str);
 }

当第 5 行中每个字符串的地址(由 str 变量表示)存储在 name[i] 数组中时,那么为什么这段代码使用 [= 将每个地址复制到 name[i] 14=]?

is this code correct?

抱歉,不可以。请遵循以下几点。

点 1

do not castmalloc()C中家人的return值。

点 2

malloc()分配内存给指针。 strcpy()填充分配的内存。对比一下代码,

  • name[i]=malloc(<size>));size 字节的内存分配给 name[i] 指针。但是,内存位置的包含未初始化或垃圾。

  • strcpy(name[i],str);复制 str 的内容到name[i]。此后,name[i] 包含与 str.

  • 相同的 string

注:

也就是说,对于 strcpy() 一个字符串 str,您需要 malloc() strlen(str) + 1 个字节,space 来终止 null。否则,您最终会超出分配的内存区域,而这又会调用 undefined behaviour.

此外,您应该(恕我直言,必须)考虑使用 fgets() 而不是 gets()

第 5 行仅分配 space。 malloc()分配的内存有未指定的值。

strcpy() 调用复制字符,而不是指针。

此外,您分配不足,因为您没有为终止 '[=11=]' 字符包含 space。因此,您的代码具有未定义的行为。

所以不,它不正确(但问题不在于它使用 strcpy(),没关系)。

也许我也认为你 should not cast the return value of malloc() in C

最后,千万不要使用gets(),这是非常危险的。使用 fgets() 代替,当然要使用适当的缓冲区大小参数。

当你使用 malloc 时,你在内存中创建一个等于字符串大小的 space,但它是一个空的 space,你只有一个地址。 您必须将字符串上的值复制到 name[i] 数组。 打个比方,你有一个装水的锅,你可以创造另一个锅,但如果你从一个锅转移到另一个锅,你只会有水。 锅的创建是malloc函数,内容的传递是strcpy。

char str[6];                       //create a empty space for 6 characters

char *name[1];                     //create a pointer for a location where
                                   //the array will be stored, does not
                                   //allocate any space

str = "abcdef"                     //assign letters to character array

name[1]=(char *)malloc(strlen(str+1));     //name[1] = _ _ _ _ _ _ _
                                           //allocate space char array with
                                           //size equal to str array plus 1

strcpy(name[1],str);                       //name[1] = a b c d e f /0
                                           //copy the letters from one char
                                           //array to the other

字符数组有 6 个字符加上一个表示数组结束的空字符

TL;DR;

malloc 分配内存供进程使用。

strcpy 将所需内容复制到 malloced 地址 space。