关于C#:cast void pointers

casting void pointers

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Do I cast the result of malloc?
Should I explicitly cast malloc()'s return value?

你好,

GCC 4.4.4C89

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

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

然而,我在这里读到,如果你投射它可以隐藏错误。如果显式转换为int,它如何隐藏错误?

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

另外,我在读一本C编程书,书中说从一个空指针(包括malloc的调用)强制转换是一种很好的编程实践。

哪个是好的编程实践?

1
2
3
4
int *int_ptr = NULL;
void *ptr = NULL;

int_ptr = ptr;

1
int_ptr = (int*)ptr;

非常感谢您的建议,


How does it hide errors if you
explicitly cast to an int?

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

Also, I was reading a c programming
book that stated it was good
programming practice to cast from a
void pointer including a call from
malloc.

Which would be good programming
practice?

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

唯一一次执行EDCOX1(0)的显式转换是因为您将编译代码为C++,因为C++不允许将其作为隐式转换。(但是如果你正在编写C++代码,在这种情况下你应该使用EDCOX1 9)。


除非是为了让GCC在您的环境中安静下来,或者如果它是由同事授权的,等等,否则不要设定void*的返回值。

强制转换或不强制转换,void*只是一个内存地址。将它赋给具有类型的变量会赋予它意义,并且避免强制转换会使代码更容易读取。