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