以下是一段代码
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
将所需内容复制到malloc
ed 地址空间中。