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



以下是一段代码

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],那么为什么这段代码使用strcpy()将每个地址复制到name[i]中?

这段代码是否正确?

对不起,没有。请遵循以下几点。

要点 1

请不要在C中强制转换malloc()和 family 的返回值。

要点 2

malloc()是为指针分配内存。strcpy()填满分配的内存。如果比较代码,

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

  • strcpy(name[i],str);它将str的包含复制到name[i]。在此之后,name[i]包含与str相同的字符串

注意:

也就是说,要strcpy()字符串str,您需要malloc()strlen(str) + 1个字节,以便有空间终止 null。否则,您最终会溢出分配的内存区域,从而调用未定义的行为。

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

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

此外,由于您没有为终止''字符包含空格,因此分配不足。因此,您的代码具有未定义的行为。

所以不,这是不正确的(但问题不在于它使用strcpy(),这很好)。

也许我也认为你不应该在 C 中转换malloc()的返回值也就不足为奇了。

最后,你永远不应该使用gets(),这是非常危险的。请改用fgets(),当然要使用适当的缓冲区大小参数。

使用 malloc 时,您会在内存中创建一个等于字符串大小的空间,但是一个空白空间,您只有一个地址。 您必须将字符串上的值复制到 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 个字符加上一个空字符以指示数组结束

第 5 行只是分配空间。malloc()分配的内存具有未指定的值。

TL;博士;

malloc为进程分配要使用的内存。

strcpy将所需内容复制到malloced 地址空间中。

相关内容

  • 没有找到相关文章

最新更新