投射void指针

可能重复:
我输入malloc的结果吗?
我应该明确地施放malloc()的返回值吗?

你好,

gcc 4.4.4 c89

通常我不会从malloc调用返回结果。

int *int_ptr = NULL;
int_ptr = malloc(sizeof(int));

不过,我在这里看过,如果你施放它可以隐藏错误。 如果你显式转换为int,它如何隐藏错误?

int_ptr = (int*)malloc(sizeof(int));

另外,我正在阅读一本关于编程的书,其中指出从包含malloc调用的void指针投射出来的编程习惯是很好的。

哪种编程习惯会很好?

int *int_ptr = NULL;
void *ptr = NULL;

int_ptr = ptr;

要么

int_ptr = (int*)ptr;

非常感谢您的任何建议,


如果你显式转换为int,它如何隐藏错误?

在调用malloc之前,它可以隐藏忽略包含stdlib.h的错误。 如果没有正确的函数声明,C编译器可以假定它返回一个int ,并且显式强制转换将掩盖你没有正确调用malloc的事实。 参见comp.lang.c FAQ中的Q7.6和Q7.16。

另外,我正在阅读一本关于编程的书,其中指出从包含malloc调用的void指针投射出来的编程习惯是很好的。

哪种编程习惯会很好?

没有必要在C中明确地转换malloc的结果。它可能会掩盖错误,并增加维护负担(如果您决定更改分配的类型,则现在必须在代码中有一个必须更改的额外站点) 。

唯一的时候你应该从void*执行一个明确的转换,所以如果你将编译你的代码为C ++,因为C ++不允许它作为隐式转换。 (但是,如果你正在编写C ++代码,在这种情况下你应该使用static_cast 。)


除非要让GCC在你的环境中保持安静,或者如果它是由同事等授权的,否则不要施加malloc()void*返回值。

投射或不投射, void*只是一个存储地址。 将它赋值给一个带有类型的变量赋予它的含义,避免转换使代码更易于阅读。

链接地址: http://www.djcxy.com/p/28355.html

上一篇: casting void pointers

下一篇: Why can't I convert 'char**' to a 'const char* const*' in C?