关于C#:我应该显式地转换malloc()的返回值吗?

Should I explicitly cast malloc()'s return value?

本问题已经有最佳答案,请猛点这里访问。

我想问一下以下情况:

1
2
char *temp;
temp = malloc(10);

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

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

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

如果我们将内存分配给temp而不将其强制转换为struct node*类型,那么它是隐式强制转换为struct node*类型,还是需要显式强制转换为struct node*类型?


如果您喜欢"不要重复自己"的心态,那么您不需要在malloc()调用中重复变量声明中的类型名,这应该是很有吸引力的。因为,正如人们所指出的,您不会:指针转换为void *或从void *转换而不丢失,函数指针除外。

另外,在这一点上,你也不需要重复使用sizeof。第二个示例,在分配结构时,可以这样编写:

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

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

避免重复会减少你写的东西的数量,这反过来又降低了那些东西出错的风险。

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

当然,您确实需要重复一些操作,例如变量名本身,但这通常是一个更简单的表达式,并且更容易纠正,而且编译器也更容易在其中发现错误。


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


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


在C++中,必须显式地强制转换,但这实际上是语言使你放弃它。在C语言中,实际上不需要强制转换,内存只是内存——我必须搜索一下,看看最新的C标准是否需要它。