【发布时间】:2022-01-16 20:45:36
【问题描述】:
我从没想过我会问这个问题,但我不知道为什么会这样。
const int a = 3;
int *ptr;
ptr = (int*)( &a );
printf( "A=%d\n", &a );
*ptr = 5;
printf( "A=%d\n", ptr );
printf( "A=%d\n", a );
printf( "A=%d\n", *ptr );
输出
A=6945404
A=6945404
A=3
A=5
怎么会这样?一个内存位置如何保存两个不同的值?我四处搜索,我发现的只是未定义的行为是未定义的。那么这没有任何意义。必须有解释。
编辑
我明白了,Marks 的答案很有意义,但我仍然想知道 const 是否被添加到语言中,以便用户不会无意中更改值。我知道旧的编译器允许你这样做,但我在 VS 2012 上试过这个,我得到了同样的行为。然后又像haccks 所说的那样,一个内存位置不能保存看起来像的两个值,那么第二个值存储在哪里?
【问题讨论】:
-
对不起,请参阅编辑
-
未定义的行为意味着任何事情都可能发生。代码可能完全按预期运行,可能会崩溃,或者可能会偷走你的女朋友。
-
您的编译器中是否配置了任何优化级别?
-
是的,我知道,我知道发生了什么,但是 const 被引入到语言中,只是为了让用户不会无意中更改值,这就是为什么我感到不安,为什么它允许我
-
您正在将
const-指针投射到不合格的指针。所有的赌注都取消了。就如此容易。如果您不知道您的目标是什么,请不要扔菜刀。