我应该明确地施放malloc()的返回值吗?

我想问一下下面的情况:

char *temp; temp = malloc(10); 

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

如果我们的指针variables是一些结构types,例如:

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

如果我们将内存分配给temp而不将其转换为struct node*types,是否将其隐式转换为struct node*types,还是需要将其显式转换为struct node* type?

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

如果你喜欢“不要重复自己”的思维方式,那么应该有吸引力,你不需要从malloc()调用中的variables声明中重复types名称。 因为,正如人们已经指出的那样,你不会指针转换为void *而不会丢失,除了函数指针。

另外,在这个说明中,你不需要重复使用sizeof 。 你的第二个例子,当分配一个结构,可以这样写:

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

在我这么不谦虚的意见中是最好的办法。

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

请注意sizeof参数中的星号,意思是“这个指针指向的对象的大小”,当然这和“ struct node的大小”一样,但不重复types名称。 这是因为sizeof计算(在编译时!)作为其参数的expression式的大小。 对于这种情况。 就像sizeof 3计算inttypes的expression式的大小一样, sizeof *temp计算struct node的一个实例的大小。

当然,你可以重复一些东西 ,也就是variables名本身,但是这通常是一个简单的expression式,并且更容易得到正确的结果,编译器也可以更容易地发现错误。

C隐式地转换为void* ,所以这个转换将自动完成。 在C ++中,只有 void*转换才会隐式完成,而对于另一个方向则需要显式强制转换。

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