投射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*
只是一个存储地址。 将它赋值给一个带有类型的变量赋予它的含义,避免转换使代码更易于阅读。
下一篇: Why can't I convert 'char**' to a 'const char* const*' in C?