微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过指针“ UnConsting”常量值

如何解决通过指针“ UnConsting”常量值

首先,对可能出现的问题冗余感到抱歉。 在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 有人能解释吗? 提前致谢。     

解决方法

        这是不确定的行为。 与确切发生的原因无关(实际上是因为编译器内联了该值)。     ,        
\"UnConsting” const value via pointer
是未定义的行为。 因此,不可能定义标准未定义的行为。     ,        编译器优化。编译器不希望您尝试这样欺骗它,它知道该值为
const
,因此仅对其进行了缓存。尝试在不进行任何优化的情况下进行编译,然后查看它是否有所不同。 通常
const
的含义是:   常量-不得修改对象。尝试这样做会导致未定义的行为。在大多数编译器上,这是编译时错误。     ,        编译器优化。您可以通过在变量中添加
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代表您做了一些优化,用ѭ7代替了对ѭ6的引用。应该可以通过查看生成的asm代码进行验证。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。