2009-06-04 60 views
51

我想请教一下下面的情况:我应该明确地施放malloc()的返回值吗?

char *temp; 
temp = malloc(10); 

由于malloc返回类型是void*,将由malloc返回的指针隐式转换为char*类型被分配到临时过吗?标准在这方面说了什么?

如果我们的指针变量例如一些结构类型:

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

如果我们没有它铸造于struct node*型分配内存来临时,将其隐式转换为struct node*型或者是有必要明确地投它到struct node*类型?

+7

如果您可能需要使用C++编译器而不是C编译器编译代码,那么需要强制转换。因此,我的大部分代码都包含了明确的转换 - 尽管纯C并不需要它。我通常用/ * = C++ = * /来标记它以指示原因。 – 2009-06-04 23:32:53

+0

尽管没有必要,但对于我来说,稍后可以帮助我阅读代码,而且不需要冗长。 – Xolve 2010-08-07 06:26:42

+2

请参阅[此问题](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)。 – unwind 2013-06-04 14:50:57

回答

33

C语言中的void指针可以分配给任何指针而不需要显式强制转换。

+9

我不认为它适用于函数指针。 – 2009-06-04 21:51:06

10

C隐式地从和到void*,所以演员将自动完成。在C++中,只有转换void*会隐式完成,因为其他方向需要显式强制转换。

+2

注意:C++不支持转换为void *而无需强制转换。 – 2009-06-04 21:15:10

3

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

49

如果您喜欢“不要重复自己”的心态,那么在malloc()调用中,您不需要重复变量声明中的类型名称。因为,正如人们已经指出的那样,你不需要:除了函数指针之外,指针可以毫无损失地转换成void *

此外,在该笔记中,您也不需要重复使用sizeof。你的第二个例子,分配结构时,可以这样写:

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

这在我不那么愚见是最好方式。

避免重复自己,减少了你写的东西的数量,从而减少了这些事情出错的风险。

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

当然,你做重复东西,即变量名本身,而这往往是一个简单的表达,更容易得到正确的,也可以是编译器更容易在发现错误。

相关问题