转换void指针

时间:2010-08-07 05:50:50

标签: c malloc

  

可能重复:
  Do I cast the result of malloc?
  Should I explicitly cast malloc()'s return value?

您好,

gcc 4.4.4 c89

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

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

但是,我在这里读到,如果你施放它可以隐藏错误。如果显式转换为int,它如何隐藏错误?

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

另外,我正在阅读一本c编程书,声称从包含来自malloc的调用的void指针进行强制编程实践。

哪种编程习惯很好?

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

int_ptr = ptr;

int_ptr = (int*)ptr;

非常感谢任何建议,

2 个答案:

答案 0 :(得分:3)

  

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

在您致电stdlib.h之前,它可以隐藏忽略包含malloc的错误。如果没有正确的函数声明,C编译器可以假设它返回int,并且显式强制转换将掩盖您没有正确调用malloc的事实。请参阅comp.lang.c常见问题解答中的Q7.6Q7.16

  

另外,我正在阅读c编程   那本书说它很好   编程实践从一个   void指针包括来自的调用   的malloc。

     

这将是一个很好的编程   练?

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

唯一一次应该从void*执行显式转换,这样你是否会将代码编译为C ++,因为C ++不允许将其作为隐式转换。 (但是如果你正在编写C ++代码,那么在这种情况下你应该使用static_cast。)

答案 1 :(得分:1)

除非要让GCC在您的环境中保持安静,或者是由同事强制要求等,否则不要强制void*返回值malloc()

投射或不投射,void*只是一个记忆地址。将它分配给具有类型的变量赋予它意义,并且避免强制转换使代码更容易阅读。