我正在尝试通过其地址更改const变量的值。
遵循此代码:
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
#include <stdio.h>
using namespace std;
int main(void)
{
uint64_t const x = -1;
uint64_t *b = reinterpret_cast<uint64_t*>(0x28ff10);
cout<< x << endl;
cout<< &x << " " << b << " " << *b << endl;
printf("%p\n", &x);
*b = 10;
cout<< &x << " " << x << " " << b << " " << *b << " " << *(reinterpret_cast<uint64_t*>(0x28ff10)) <<endl;
return 0;
}
使用MinGW编译4.8.1
:
g ++ -g main.cpp&amp;&amp; ./a.exe
这是输出:
18446744073709551615
0x28ff10 0x28ff10 18446744073709551615
0028FF10
0x28ff10 18446744073709551615 0x28ff10 10 10
有人可以解释一下吗?
编辑:
想通了!编译仍然优化了我的变量,虽然我用-O0
编译它。看着生成的ASM,我看到printf和cout直接放入值而不是变量符号。
因此,为了使我的代码做正确的行为,我必须用volatile static
答案 0 :(得分:5)
我试图通过其地址更改const变量的值。
到目前为止,你已经出了问题。
const
是&#34;常数&#34;的缩写。
你不能改变常数。
有时你可以让它看起来像你做的那样,但这样做有未定义的行为。你告诉你的编译器它可以做出关于x
的各种假设(包括完全从你的二进制文件中优化它!)因为你保证你永远不会改变它。然后你改变它。
今晚没有晚餐给你,Compiler先生说!