为什么通过强制转换的int指针赋值后float变量b值未按预期变更?
为什么通过强转后的int指针修改float变量没有得到预期值
根因分析
- 你的操作首先违反了C语言的严格别名规则,属于标准明确定义的未定义行为:C语言要求除了char等少数例外类型,同一块内存空间不能通过基础类型不兼容的指针读写,编译器对这类代码的处理没有任何约束,出现任何运行结果都是符合规范的。
- 从硬件存储逻辑上也可以解释你看到的运行结果:
多数主流系统下int和float都占用4字节内存,你把float变量b的地址强转为int*赋值给a后,给*a赋值10的操作,本质是把整数10的二进制补码0x0000000a直接写入了b对应的4字节内存。
但float类型是按照IEEE 754单精度浮点数标准解析内存的,0x0000000a对应的浮点数是一个量级极小的非规格化数,远小于printf用%lf输出时默认保留的6位小数的精度阈值,所以输出显示为0.000000。
而你读取*a时是按照int类型规则解析同一段内存,自然可以得到你写入的10。
正确实现方案
如果需要通过指针修改float类型变量的值,要保证指针的基础类型和变量类型完全匹配:
float *a; float b = 5.1; a = &b; *a = 10; // 此时b的值为10.0,输出符合预期
内容的提问来源于stack exchange,提问作者Natindo
相关产品推荐
相关产品推荐

