通过指针“UnConsting”const值

时间:2011-06-13 07:45:32

标签: c++

首先,抱歉可能出现问题冗余。

在GCC中用C / C ++指针做一些小实验我在绕过指针地址的值的常量时遇到了这种有点奇怪的行为。

#include <iostream>
int main()
{
    using namespace std;

    const double number = 100;
//bypassing constantess of pointed-to value
    double * pointer_to_value = (double *) &number;
    *pointer_to_value += 200;

    cout << "Adress of number: " << &number << "\tValue of number: " << number << endl <<
    "   Pointer value: " << pointer_to_value << "\tDereferencing pointer: " << *pointer_to_value;

    return 0;
}

我希望两种形式都能检查产生相同结果的值。两种情况下的价值位置相同。然而,程序会生成以下输出:

号码地址:0x22ff30号码值: 100 指针值:0x22ff30取消引用指针: 300

任何有能力解释的人? 提前谢谢。

5 个答案:

答案 0 :(得分:10)

这是undefined behaivor

它究竟发生的原因无关紧要(实际上是因为编译器内联了这个值)。

答案 1 :(得分:5)

"UnConsting” const value via pointer 未定义的行为
因此,定义未由标准定义的行为是不可能的。

答案 2 :(得分:1)

编译器优化。编译器不希望你尝试像这样欺骗它,它知道值是const,所以它只是缓存它。尝试编译它而不进行任何优化,看看它是否有任何区别。

一般来说const的含义是:

  

常量 - 不得修改对象。尝试这样做会导致未定义的行为。在大多数编译器上,它是编译时错误。

答案 3 :(得分:0)

编译器优化。您可以通过向变量添加volatile关键字来解决此问题。

#include <iostream>
int main()
{
    using namespace std;

    volatile const double number = 100;
    //bypassing constantess of pointed-to value
    double * pointer_to_value = (double *) &number;
    *pointer_to_value += 200;

    cout << "Adress of number: " << &number << "\tValue of number: " << number << endl <<
    "   Pointer value: " << pointer_to_value << "\tDereferencing pointer: " << *pointer_to_value;

    return 0;
}

答案 4 :(得分:0)

我的猜测是,gcc代表您做了一些优化,将<< number的引用替换为<< 100。应该可以通过查看生成的asm代码进行验证。