如何解决通过指针“ 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 举报,一经查实,本站将立刻删除。