malloc要不要强制转换返回值
发布网友
发布时间:2022-04-25 13:01
我来回答
共1个回答
热心网友
时间:2024-09-28 09:10
在C里,用malloc动态分配内存时,是不推荐强转其返回值的。例如
int *arr = malloc(sizeof(int) * 5);而不是int *arr = (int *)malloc(sizeof(int) * 5);
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的返回值,编译器就不会做警告了。在运行时就可能出问题。