繁体   English   中英

通过指针的“UnConsting”常量值

[英]“UnConsting” const value via pointer

首先,对于可能的问题冗余感到抱歉。

在 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;
}

我希望这两种形式的检查值都会产生相同的结果。 在这两种情况下,价值的位置是相同的。 程序生成如下 output,然而:

数字地址:0x22ff30 数字值: 100指针值:0x22ff30 解引用指针: 300

有谁能解释一下吗? 提前致谢。

这是未定义的行为。

它为什么会发生无关紧要(实际上是因为编译器内联了该值)。

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

编译器优化。 编译器不希望你像那样尝试欺骗它,它知道值是const ,所以它只是缓存了它。 尝试在没有任何优化的情况下编译它,看看它是否有什么不同。

一般const的含义是:

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

编译器优化。 您可以通过向变量添加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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM