3

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

4

4 回答 4

7

好吧,在 C 中你不必做演员表,所以你的观点没有实际意义。也就是说,这两个语句是 100% 等效的:

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

void *C 中隐含了到和从的转换。因此,为了解决您的问题,返回的真正原因 是您不必强制转换。mallocvoid *

除此之外,在 C 中没有办法传递类型信息,所以这样做:

 char *x = malloc(100, char);

不可能。

malloc如果您使用 C++,则强制转换是必要的,但无论如何您都不应该使用- 这new就是用途,它确实可以正确处理类型信息。

于 2013-06-23T14:12:18.640 回答
3

从 C 标准 ISO/IEC 9899 2011,第 6.2.2.3 节开始,这根本不是 hacky:

指向 void 的指针可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转​​换。指向任何对象类型的指针都可以转换为指向 void 的指针并再次返回;结果应与原始指针比较。

因此,指向的指针void*是指向您想要的任何类型的有效指针,无需显式强制转换。

除此之外,您不能动态地将类型传递给函数 let 以便它返回正确的类型,您可以只传递大小本身(因此 mallocsize_t count * size_t size在任何情况下都能够分配但不能返回正确的类型)。

于 2013-06-23T14:12:57.913 回答
0

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

于 2013-06-23T14:12:46.843 回答
0

有两个原因,首先,malloc 不知道为什么需要内存。所以它只返回要求返回的字节数。其次,您不能轻易取消引用 void * ,因此它可以帮助您避免事故。

int *p;
p = (int *)malloc(sizeof(int)*10);
于 2018-04-08T04:57:34.830 回答