0

这是我的测试代码:

#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”怎么会不同???这可能很危险,对吧?

4

6 回答 6

8

抛弃const是合法的;使用由此获得的指针(或引用)来(尝试)修改const对象是非法的。

您的代码导致未定义的行为;它可以做任何事情,而且没有任何意义。

于 2012-08-20T11:12:07.697 回答
3

以任何方式修改常量变量都会导致Undefined Behavior
所以是的,这很危险。
未定义的行为意味着任何行为都是可能的,并且您不能期望任何有效的行为。编译器可以免费为您提供任何结果,并且标准允许这样做。一旦调用了 UB,该程序就不再是有效程序。所以最好避免任何导致 UB 的代码。

于 2012-08-20T11:12:29.370 回答
1

它们可能不同,因为“e”是一个常量,因此任何体面的编译器都会在编译时插入该值,而不是从内存中读取它。

由于您获取地址,因此它仍然有一个“真实”变量,但在您的情况下实际上并未使用它。

而且您“很幸运”可以完全修改该值;由于它被声明为“const”,编译器可以将它放入只读内存中。

无论哪种方式,修改 const 值都会产生“未定义的行为”。我们很幸运,你没有用你愚蠢的游戏毁灭世界。

于 2012-08-20T11:13:04.910 回答
0

您正在尝试写入一个未定义的行为的常量变量(是的,这个名字很矛盾,但我离题了)。

于 2012-08-20T11:13:13.203 回答
0

你正在抛弃 const。这给了你错误的价值,这是未定义的行为。它应该是

int e = 2;
int* p = (int *)&e;
*p = 4;

或者

const int e = 2;
const int* p = (const int *)&e;
*p = 4;

后一个会在您写入 const 时给您编译错误。

于 2012-08-20T11:15:01.890 回答
0

定义变量:

 const int e = 2;

指令 const 告诉 c/c++ 编译器检查 e 变量的 L 值,编译器会阻止你的代码为 e 分配新值。

int* p = (int *)&e;

p is a pointer (also int 4 bytes), can be assigned any value , p = (((int *) e ) -2)+2. The compiler no need to check *p whether *p is constant. I think that is a flexible of c/c++ languages, the better way is avoiding pointer.

于 2012-08-20T13:30:46.553 回答