为什么C语言里不推荐强制转换malloc的返回值?

在C里,用malloc动态分配内存时,是不推荐强转其返回值的。例如
int *arr = malloc(sizeof(int) * 5);

而不是
int *arr = (int *)malloc(sizeof(int) * 5);

为什么呢?原因有2:

1. C里面从void *到其它类型的指针是自动转换的。例如
int n = 1;
int *pn = &n;
void *pv = pn;
int *pn2 = pv;
这里并不需要任何强制类型转换。

2. 在旧式的C编译器里,如果一个函数没有原型声明,那么编译器会认为这个函数返回int。那么,如果碰巧代码里忘记包含头文件或者,那么编译器看到malloc调用时,会认为它返回一个int。

在实际运行时,malloc的返回值(一个void*指针),会被直接解释成一个int。如果这时强制转换这个值,实际就是将int直接转换为(void*)。这里有2个问题:a) (void*)和int可能不能“无损”地相互转换,例如它们长度压根就不同,或者编译器就不支持这种转换。b) 即使可以相互转换,它们的表示也可能不同,即需要显示转换。而直接将(void*)当成int来用,然后再把这个int转换回(void*),在这种情况下肯定是会有问题的。

如果这时没有强转malloc的返回值,编译器看到要把int转换为(int*),就会发出一条警告。而如果强转了malloc的返回值,编译器就不会做警告了。在运行时就可能出问题。

参考:
http://c-faq.com/malloc/mallocnocast.html

你可能感兴趣的:(C/C++,语言,c,编译器)