我在一个简单的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);
}
怎么可能?
修改
事实上,我知道这种行为是未定义的,但这是一个技术问题: HOW 一个地址可以存储2个不同的值?
答案 0 :(得分:1)
未定义的行为。您正在修改const
变量。
C11 Standard Appendix J.2. Undefined behavior:
尝试通过使用具有非const限定类型(6.7.3)的左值来修改使用const限定类型定义的对象。
附录J.2虽然不具备规范性,但在查找标准中的实际规范位置时非常方便。 6.7.3 in paragraph 6说:
6如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义。如果尝试通过使用具有非volatile限定类型的左值来引用使用volatile限定类型定义的对象,则行为未定义.133)
由于您尝试并成功修改了使用const限定类型(const bool b
)定义的对象,因此使用了非const限定类型bool
的左值(此处为*adr_b
}),C标准对此后的程序行为“没有要求”。有nasal demons。