在这个问题上,有人在评论中建议我不要使用malloc的结果。即,我应该这样做:
int *sieve = malloc(sizeof(*sieve) * length);
而不是:
int *sieve = (int *) malloc(sizeof(*sieve) * length);
为什么会这样?
在这个问题上,有人在评论中建议我不要使用malloc的结果。即,我应该这样做:
int *sieve = malloc(sizeof(*sieve) * length);
而不是:
int *sieve = (int *) malloc(sizeof(*sieve) * length);
为什么会这样?
当前回答
void指针背后的概念是它可以被强制转换为任何数据类型,这就是malloc返回void的原因。此外,您必须了解自动打字。因此,虽然必须强制强制强制转换指针,但它有助于保持代码整洁,并有助于调试
其他回答
不强制强制强制强制转换malloc的结果,因为它返回void*,并且void*可以指向任何数据类型。
这取决于编程语言和编译器。如果在C中使用malloc,则无需键入cast,因为它会自动键入cast。然而,如果您使用的是C++,那么应该键入cast,因为malloc将返回void*类型。
malloc的主要问题是获得正确的大小。
malloc()返回的内存是非类型的,由于简单的强制转换,它不会神奇地获得有效的类型。
我想这两种方法都很好,选择应该取决于程序员的意图。
如果为类型分配内存,则使用强制转换。
ptr=(T*)malloc(sizeof(T));
如果为给定指针分配内存,则不要使用强制转换。
ptr=malloc(sizeof*ptr);
Ad 1
第一种方法通过为给定类型分配内存,然后将其强制转换以确保分配给正确的指针,从而确保正确的大小。如果使用了不正确的ptr类型,则编译器将发出警告/错误。如果ptr的类型被更改,那么编译器将指出代码需要重构的地方。
此外,第一种方法可以组合成类似于C++中新运算符的宏。
#define NEW(T) ((T*)malloc(sizeof(T)))
...
ptr = NEW(T);
此外,如果ptr为void*,则此方法有效。
Ad 2
第二个方法不关心类型,它通过从指针的类型中获取数据来确保正确的大小。这种方法的主要优点是,每当ptr的类型发生变化时,都可以自动调整存储大小。它可以在重构时节省一些时间(或错误)。
缺点是,如果ptr为空,则该方法不起作用,但它可能被认为是一件好事。而且它不适用于C++,因此不应在C++程序将要使用的头中的内联函数中使用。
就我个人而言,我更喜欢第二种选择。
void指针背后的概念是它可以被强制转换为任何数据类型,这就是malloc返回void的原因。此外,您必须了解自动打字。因此,虽然必须强制强制强制转换指针,但它有助于保持代码整洁,并有助于调试
强制转换只适用于C++而不是C。如果您使用的是C++编译器,最好将其更改为C编译器。