在这个问题上,有人在评论中建议我不要使用malloc的结果。即,我应该这样做:

int *sieve = malloc(sizeof(*sieve) * length);

而不是:

int *sieve = (int *) malloc(sizeof(*sieve) * length);

为什么会这样?


当前回答

不强制强制强制强制转换malloc的结果,因为它返回void*,并且void*可以指向任何数据类型。

其他回答

void指针是泛型指针,C支持从void指针类型到其他类型的隐式转换,因此不需要显式类型转换。

然而,如果您希望相同的代码在不支持隐式转换的C++平台上完美兼容,则需要进行类型转换,因此这一切都取决于可用性。

这取决于编程语言和编译器。如果在C中使用malloc,则无需键入cast,因为它会自动键入cast。然而,如果您使用的是C++,那么应该键入cast,因为malloc将返回void*类型。

在C语言中,您得到了从void*到任何其他(数据)指针的隐式转换。

malloc的转换在C中是不必要的,但在C++中是必需的。

C中不需要铸造,因为:

在C的情况下,void*会自动安全地升级为任何其他指针类型。如果您忘记包含<stdlib.h>,它可能会隐藏错误。这可能会导致崩溃。如果指针和整数的大小不同,则通过强制转换隐藏警告,可能会丢失返回地址的位。如果指针的类型在声明时发生了更改,那么可能还需要更改调用和强制转换malloc的所有行。

另一方面,强制转换可能会增加程序的可移植性。即它允许C程序或函数编译为C++。

void指针背后的概念是它可以被强制转换为任何数据类型,这就是malloc返回void的原因。此外,您必须了解自动打字。因此,虽然必须强制强制强制转换指针,但它有助于保持代码整洁,并有助于调试