此代码是否正确?如果是,则 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
将所需内容复制到 malloc
ed 地址 space。
下面是一段代码
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
将所需内容复制到 malloc
ed 地址 space。