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

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

而不是:

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

为什么会这样?


当前回答

在C语言中,可以将空指针分配给任何指针,这就是为什么不应该使用类型转换的原因。如果您想要“类型安全”分配,我可以推荐以下宏函数,这些函数我总是在C项目中使用:

#include <stdlib.h>
#define NEW_ARRAY(ptr, n) (ptr) = malloc((n) * sizeof *(ptr))
#define NEW(ptr) NEW_ARRAY((ptr), 1)

有了这些,你可以简单地说

NEW_ARRAY(sieve, length);

对于非动态数组,第三个必须的函数宏是

#define LEN(arr) (sizeof (arr) / sizeof (arr)[0])

这使得阵列环路更加安全和方便:

int i, a[100];

for (i = 0; i < LEN(a); i++) {
   ...
}

其他回答

现在不需要强制转换malloc()返回的值,但我想补充一点,似乎没有人指出:

在古代,也就是说,在ANSI C提供void*作为指针的通用类型之前,char*是这种用法的类型。在这种情况下,强制转换可以关闭编译器警告。

参考:C常见问题解答

在C语言中,可以将空指针分配给任何指针,这就是为什么不应该使用类型转换的原因。如果您想要“类型安全”分配,我可以推荐以下宏函数,这些函数我总是在C项目中使用:

#include <stdlib.h>
#define NEW_ARRAY(ptr, n) (ptr) = malloc((n) * sizeof *(ptr))
#define NEW(ptr) NEW_ARRAY((ptr), 1)

有了这些,你可以简单地说

NEW_ARRAY(sieve, length);

对于非动态数组,第三个必须的函数宏是

#define LEN(arr) (sizeof (arr) / sizeof (arr)[0])

这使得阵列环路更加安全和方便:

int i, a[100];

for (i = 0; i < LEN(a); i++) {
   ...
}

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

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

在C语言中,不需要强制转换malloc的返回值。malloc返回的指向void的指针会自动转换为正确的类型。但是,如果您想用C++编译器编译代码,则需要强制转换。社区中的首选替代方案是使用以下方法:

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

另外,如果你改变了筛子的类型,你就不用担心改变表达式的右边。

正如人们所指出的那样,铸件是不好的。尤其是指针强制转换。