【问题标题】:strange behavior in C constant pointer [duplicate]C常量指针中的奇怪行为[重复]
【发布时间】:2013-06-11 07:26:05
【问题描述】:

下面几行的结果应该是什么?

const int ci=10;
int * ip=(int *)&ci;
(*ip)=90;

我们有两条规则,常量不能改变,直接使用 * 操作符改变一部分内存必须改变那部分内存的内容。 但是当我尝试打印这些变量时,我会遇到这样的事情:

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

我们该如何解释呢?

【问题讨论】:

  • 修改常量对象是未定义的行为。我相信我会找到一个重复的帖子。
  • 稍微解释一下 jogojapan 的评论 - 未定义的行为意味着任何事情都可能发生,包括您刚刚看到的。
  • @Barmar 谢谢。我现在也添加了指向 C++ 副本的链接。

标签: c++ c pointers constants


【解决方案1】:

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

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

但是,你通过一种不礼貌的方式改变内存,编译器并没有意识到这个事实!

所以,“constant”关键字并不是严格的约束,只是程序员和编译器之间的约定

【讨论】:

    【解决方案2】:

    没有什么“应该”是结果。

    任何“可能”都是结果。

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

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

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 2012-05-29
      • 1970-01-01
      • 2012-09-21
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多