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

这个问题已经在这里有了答案:

  • 我要转换malloc的结果吗?                                     26个答案

我想询问以下情况:

char *temp;
temp = malloc(10);

由于struct node*的返回类型为struct node*,将struct node*返回的指针在分配给temp之前是否隐式转换为char*类型? 标准在这方面怎么说?

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

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

如果我们将内存分配给temp而不将其转换为struct node*类型,是将其隐式转换为struct node*类型,还是必须将其显式转换为struct node*类型?

mawia asked 2020-01-14T11:36:27Z
4个解决方案
51 votes

如果您喜欢“不要重复自己”的心态,则应该吸引人的是,您不需要在malloc()216调用中从变量的声明中重复类型名称。 因为,正如人们指出的那样,您不会:指针在sizeof之间进行转换而不会丢失,函数指针除外。

同样,在该注释上,您也不需要重复使用sizeof。 您的第二个示例在分配结构时可以这样编写:

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

在我看来,这不是最好的方法。

避免重复自己,减少了所写内容的数量,从而减少了其中任何错误内容的风险。

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

当然,您确实要重复一些操作,即变量名本身,但这通常是一个更简单的表达式,更容易正确使用,也可以使编译器更容易发现错误。

unwind answered 2020-01-14T11:37:29Z
33 votes

可以将C中的void指针分配给任何指针,而无需显式强制转换。

tekBlues answered 2020-01-14T11:36:45Z
10 votes

C隐式地从和强制转换为void*,因此强制转换将自动完成。 在C ++中,仅隐式地转换为void*,对于另一个方向,则需要显式强制转换。

sth answered 2020-01-14T11:37:49Z
3 votes

在C ++中,您必须显式进行强制转换,但这实际上只是告诉您执行此操作的语言。
在c语言中,确实不需要强制转换,内存只是内存-我将不得不进行搜索以查看最新的C标准是否需要它。

Martin Beckett answered 2020-01-14T11:38:14Z
translate from https://stackoverflow.com:/questions/953112/should-i-explicitly-cast-mallocs-return-value