首页 > 解决方案 > 为什么更改没有通过指针分配新值

问题描述

为什么变量 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

标签: cpointers

解决方案


虽然我们可以将一个plain分配给inta float,反之亦然,然后得到一个隐式转换,但这不适用于指针。

a = (int*)&b是无效的指针转换。你对编译器撒谎并说存储在 address 的东西&b是一个int. 这不是。这是未定义的行为 - 两种不同的类型可能有不同的大小 - 但它也是“严格的别名违规”什么是严格的别名规则?

由于您的代码包含未定义的行为,任何事情都可能发生。什么是未定义的行为,它是如何工作的?许多可能的行为之一是系统尝试将二进制表示重新解释为浮点数,其中 0xA 在小数部分结束得如此之低,以至于它被舍入为零。该程序也可能崩溃或显示任何随机垃圾。


推荐阅读