【发布时间】:2017-06-21 20:04:50
【问题描述】:
我在一个简单的 C 代码中发现了一点奇怪的东西。
实际上,我有 2 个变量,第一个是 const 变量,第二个是第一个变量的指针。
问题是,如果我打印这 2 个地址,它们是相同的,但如果我打印的值是不同的:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(void)
{
bool const b = true;
bool *adr_b = (bool*)&b;
*adr_b = false;
printf("%p\n%p\n", &b, adr_b);
printf("str = %d %d\n", b, *adr_b);
printf("%p\n%p\n", &b, adr_b);
return (0);
}
这怎么可能?
编辑
事实上,我知道这种行为是未定义的,但这是一个技术问题:如何一个地址可以存储 2 个不同的值?
【问题讨论】:
-
所以你故意调用 undefined behavior 并想知道为什么你的代码表现得未定义? Leran 演员表的用途,如果您不完全了解演员表的作用,永远不要使用演员表!您告诉编译器不要抱怨,从而积极反对编译器。
-
不要对格式感兴趣!代码很难阅读。
-
“如何一个地址可以存储 2 个不同的值?”——您错误地认为一个地址在这里存储了 2 个值。该程序具有未定义的行为(不止一次),因此完全无效。此外,当我在我的系统上编译并运行它(忽略警告)时,我得到
str = 0 0作为输出。未定义的行为是没有意义的。 -
编译器可能决定它知道
b不能改变(它是const),所以它不需要再次查看存储的值——它知道它必须是什么.它可能会决定它不知道adr_b并查看内存。但这只是一种可能。任何结果都是有效的,因为代码具有未定义的行为。
标签: c pointers casting memory-address