问题描述
首先,对可能出现的问题冗余感到抱歉。
在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代码进行验证。