C常量指针中的奇怪行为

时间:2013-06-11 07:26:06

标签: c++ c pointers constants

以下几行应该是什么结果?

const int ci=10;
int * ip=(int *)&ci;
(*ip)=90;
我们有两条规则,常量不能改变,直接用*运算符改变一部分内存必须改变那部分内存的内容。 但是当我尝试打印这些变量时,我会遇到这样的事情:

cout<<ci<<' '<<(*ip)<<endl;
// output: 10 90

我们怎么解释这个?

2 个答案:

答案 0 :(得分:4)

哦,这只是编译器使用的名为常量折叠的优化技术。

因为,你告诉编译器ci是一个常量int,所以,它会信任你并在编译你的代码时用c替换ci的所有引用,所以如果你cout<<ci,你会得到一个10显示,这不是因为ci占用的内存没有变化,只是因为编译器在使用ci的地方用10替换ci!

但是,你通过不礼貌的方式改变记忆,编译器没有意识到这一点!

因此,“constant”关键字不是严格约束,而只是程序员和编译器之间的契约

答案 1 :(得分:1)

结果没有“应该”。

任何“可能”都是结果。

由于某种原因未定义未定义的行为。编译器可能以意外的方式处理常量变量。许多编译器可以在堆栈上创建变量,让您更改它们。其他人可以使用Copy-on-Write机制进行优化。

你可能会得到相同的数字,你可能得到不同的数字,你可能会得到一个段错误,你可能会修改与其他const变量共享的读写数据,因为它不会发生变化。未定义未定义。解释它是一个愚蠢的错误。