以下是一段代码
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]
数组中时,为什么此代码使用{{1}将每个地址复制到name[i]
}?
答案 0 :(得分:4)
这段代码是否正确?
对不起,不。请按照以下几点说明。
第1点
请malloc()
C
和malloc()
家人的回复价值do not cast。
第2点
strcpy()
将分配内存到指针。 name[i]=malloc(<size>));
将填充分配的内存。如果你比较代码,
size
将name[i]
个字节的内存分配给strcpy(name[i],str);
指针。但是,内存位置的包含是未初始化的或垃圾。
str
它复制 name[i]
到name[i]
的内容。在此之后,str
包含与strcpy()
相同的字符串。
注意:强>
也就是说,str
字符串malloc()
,strlen(str) + 1
字节需要fgets()
,以便有空格来终止空。否则,您将最终超出分配的内存区域,而后者又会调用undefined behaviour。
另外,你应该(恕我直言,必须)考虑在gets()
上使用CGAL/AABB_polyhedron_triangle_primitive.h
。
答案 1 :(得分:2)
strcpy()
调用会复制字符,而不是指针。
此外,由于您未能为终止'\0'
字符包含空格,因此分配不足。因此,您的代码具有未定义的行为。
所以不,它不正确(但问题不在于它使用strcpy()
,这很好。)
也许我认为你should not cast the return value of malloc()
in C也就不足为奇了。
最后,你永远不应该使用gets()
,这是非常危险的。当然,请使用fgets()
,并使用适当的缓冲区大小参数。
答案 2 :(得分:1)
当你使用malloc时,你在内存中创建一个等于字符串大小的空间,但是是一个空的空间,你只有一个地址。 您必须将字符串上的值复制到name [i]数组。 一个类比是,你有一个带水的锅,你可以创造另一个锅,但如果你从一个转移到另一个锅,你只会有水。 pot的创建是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个字符加上一个空字符,表示数组的结尾
答案 3 :(得分:0)
第5行只是分配空间。由malloc()
分配的内存具有未指定的值。
答案 4 :(得分:0)
TL; DR;
malloc
为要使用的进程分配内存。
strcpy
将所需内容复制到malloc
ed地址空间。