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

本文详细解析了在C语言中使用malloc动态分配内存时避免强制类型转换的原因,包括自动类型转换机制及旧式编译器下的潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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。那么,如果碰巧代码里忘记包含头文件<stdlib.h>或者<malloc.h>,那么编译器看到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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值