这是我的测试代码:
#define print(A) cout << #A << " = " << A << endl;
int main()
{
const int e = 2;
int *p = (int *)&e;
*p = 4;
print(e);
print(*p);
print(&e);
print(p);
}
结果:
e = 2;
*p = 4;
&e = 0xbfc6b458;
p = 0xbfc6b458;
既然"p"根据它们相同的地址指向"e",那么*p和"e"怎么会不同呢???这可能很危险,对吧?
丢弃const
是合法的;使用由此获得的指针(或引用)来(试图)修改CCD_ 2对象是非法的。
您的代码会导致未定义的行为;它可以做任何事情,而且不一定要有任何意义。
以任何方式修改常量变量都会导致未定义的行为
是的,这很危险
未定义的行为意味着任何行为都是可能的,并且您不能期望任何有效的行为。编译器可以自由地给你任何结果,标准允许这样做。一旦调用UB,程序就不再是有效的程序。所以最好是避免任何导致UB的代码。
它们可能不同,因为"e"是一个常量,所以任何合适的编译器都会在编译时插入该值,而不是从内存中读取。
既然你取了地址,它仍然有一个"真实"的变量,但它并没有实际用于你的情况。
你很"幸运",你可以修改这个值;由于它被声明为"const",编译器本可以将它放入只读内存中。
无论哪种方式,修改常量值都会产生"未定义的行为"。幸运的是,你没有用愚蠢的游戏摧毁世界。
您正试图写入一个常量变量(是的,这个名称很矛盾,但我离题了),这是未定义的行为。
您正在丢弃const。这给了你错误的价值,这就是未定义的行为。应该是
int e = 2;
int* p = (int *)&e;
*p = 4;
或
const int e = 2;
const int* p = (const int *)&e;
*p = 4;
后一个会给您带来编译错误,因为您正在编写常量。
定义变量:
const int e = 2;
指令const告诉c/c++编译器检查e变量的L值,编译器将阻止您的代码为e分配新值。
int* p = (int *)&e;
p是一个指针(也是int 4字节),可以分配任何值,p=(((int*)e)-2)+2。编译器不需要检查*p是否为常量。我认为这是一种灵活的c/c++语言,更好的方法是避免指针。