malloc返回类型void *的意图/好处是什么?

时间:2013-06-23 14:09:07

标签: c linux pointers memory-management malloc

知道更多C ++而不是CI想知道是否有人可以解释为什么malloc()总是返回一个void类型的指针,而不是malloc已经实现了某种机制,允许它返回用户传入的类型的指针?它似乎有点“hacky”不断显式地将返回的void指针强制转换为你想要的类型。

4 个答案:

答案 0 :(得分:7)

嗯,在C中你不必进行演员表,所以你的观点没有实际意义。也就是说,这两个陈述是100%等价的:

 char *x = malloc(100);
 char *y = (char *)malloc(100);

来自void *的转化隐含在C中。因此,为了解决您的问题,非常理由 malloc返回void *是为了让您< em>不必须施放。

除此之外,在C中没有办法传递类型信息,所以做了类似的事情:

 char *x = malloc(100, char);

是不可能的。

如果您使用的是C ++,那么强制转换是必要的,但您不应该使用malloc - 这就是new的用途,并且它会正确处理类型信息。

答案 1 :(得分:2)

根本不是hacky,来自C标准ISO / IEC 9899 2011,第6.2.2.3节:

  

指向void的指针可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void的指针,然后再返回;结果应该等于原始指针。

所以指向void*的指针是指向你想要的任何类型的有效指针,而不需要显式转换。

除此之外,您无法动态地将类型传递给函数以使其返回正确的类型,您只能传递大小(因此malloc可以分配size_t count * size_t size但是在任何情况下都不会返回正确的类型。)

答案 2 :(得分:0)

C根本没有“传递类型”的机制。此外,在C中,从void *到任何其他类型的指针的转换是自动的(不需要强制转换),因此malloc在C中自然地工作。它只在C ++中,其中malloc需要强制转换才能工作。

答案 3 :(得分:0)

有两个原因,首先,malloc不知道你为什么需要内存。所以它只返回要求返回的字节数。其次,你不能轻易地去除空*,这样可以帮助你避免事故。

int *p;
p = (int *)malloc(sizeof(int)*10);