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

时间:2015-05-05 15:06:08

标签: c string pointers malloc 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]数组中时,为什么此代码使用{{1}将每个地址复制到name[i] }?

5 个答案:

答案 0 :(得分:4)

  

这段代码是否正确?

对不起,不。请按照以下几点说明。

第1点

malloc() Cmalloc()家人的回复价值do not cast

第2点

strcpy()分配内存到指针。 name[i]=malloc(<size>));填充分配的内存。如果你比较代码,

  • sizename[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地址空间。