c - 为什么更改没有通过指针分配新值
问题描述
为什么变量 b 没有赋值 10?
int *a;
int c = 5;
float b = 5.1;
a = (int*)&b;
*a = 10;
printf ("a = %p, &b = %p, b = %lf, *a = %d\n", a, &b, b, *a);
结果:b = 0.00000,*a = 10
解决方案
虽然我们可以将一个plain分配给int
a float
,反之亦然,然后得到一个隐式转换,但这不适用于指针。
a = (int*)&b
是无效的指针转换。你对编译器撒谎并说存储在 address 的东西&b
是一个int
. 这不是。这是未定义的行为 - 两种不同的类型可能有不同的大小 - 但它也是“严格的别名违规”什么是严格的别名规则?
由于您的代码包含未定义的行为,任何事情都可能发生。什么是未定义的行为,它是如何工作的?许多可能的行为之一是系统尝试将二进制表示重新解释为浮点数,其中 0xA 在小数部分结束得如此之低,以至于它被舍入为零。该程序也可能崩溃或显示任何随机垃圾。
推荐阅读
- python-3.x - 替换单列熊猫中的行值
- spring-boot - 谷歌云计算引擎无法访问外部ip spring boot
- javascript - 将类名添加到确切的元素
- php - Codigniter:我不想在登录页面上加载模板的页眉和页脚部分
- java - 坚持如何在 Spring Data 应用程序中查找 QueryDSL 谓词
- javascript - 如何让倒计时每八小时开始一次?
- node.js - 需要在 MERN 堆栈应用程序中添加视频会议(特别是课堂/教育)的建议
- php - 运行 sql 查询以使现有用户无法正常工作时,我在使用 PDO 语句时遇到问题
- php - Wordpress 页面总是重新加载旧缓存 (LiteSpeed)
- javascript - ES lint 初始化设置未显示 VS Code Windows 操作系统