我应该显式地转换malloc()的返回值吗?

时间:2009-06-04 21:09:02

标签: c pointers casting

我想询问以下案例:

char *temp;
temp = malloc(10);

由于malloc的返回类型为void*malloc返回的指针是否会在分配给temp之前被隐式转换为char*类型?标准在这方面说了什么?

如果我们的指针变量是某种结构类型,例如:

struct node *temp;
temp = (struct node *)malloc(sizeof(struct node));

如果我们将内存分配给temp而不将其强制转换为struct node*类型,是否会将其隐式转换为struct node*类型,或者是否有必要将其显式转换为struct node*类型?

4 个答案:

答案 0 :(得分:51)

如果您喜欢“不要重复自己”的心态,那么在malloc()调用中,您不需要重复变量声明中的类型名称就很有吸引力。因为,正如大家所指出的那样,你没有:指针转换为void *和从sizeof转换而不会丢失,但函数指针除外。

另外,就此而言,您也不需要使用struct node *temp; temp = malloc(sizeof *temp); 重复自己。第二个例子,在分配结构时,可以这样写:

sizeof

在我不那么谦虚的意见中,最佳方式。

避免重复你自己减少了你写的东西的数量,这反过来又减少了任何这些错误的风险。

注意struct node参数中的星号,这意味着“此指针所指向的对象的大小”,这当然与“sizeof类型的大小”相同但是不重复类型名称。这是因为sizeof 3计算(在编译时!)作为其参数的表达式的大小。对于这种情况。就像int计算sizeof *temp类型表达式的大小一样,struct node计算{{1}}实例的大小。

当然,你会重复某些东西,即变量名称本身,但这通常是一个更简单的表达式,更容易正确,并且编译器也可以更容易发现错误。

答案 1 :(得分:33)

C中的void指针可以分配给没有显式强制转换的任何指针。

答案 2 :(得分:10)

C隐式地从void*转换为void*,因此转换将自动完成。在C ++中,只有隐式地将转换为 {{1}},对于另一个方向,需要进行显式转换。

答案 3 :(得分:3)

在C ++中你必须明确地演员,但这只是告诉你这样做的语言 在c中没有任何需要强制转换,内存只是内存 - 我将不得不进行搜索以查看最新的C标准是否需要它。