与const相同的地址而不是相同的值

时间:2017-06-21 20:04:51

标签: c pointers casting memory-address

我在一个简单的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个不同的值?

1 个答案:

答案 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