我应该明确地施放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
计算int
types的expression式的大小一样, sizeof *temp
计算struct node
的一个实例的大小。
当然,你可以重复一些东西 ,也就是variables名本身,但是这通常是一个简单的expression式,并且更容易得到正确的结果,编译器也可以更容易地发现错误。
C隐式地转换为void*
,所以这个转换将自动完成。 在C ++中,只有向 void*
转换才会隐式完成,而对于另一个方向则需要显式强制转换。
在C ++中,你必须明确地施放,但这实际上只是告诉你这样做的语言。
在c中没有任何需要强制转换,内存只是内存 – 我将不得不做一个search,看看最新的C标准是否需要它。