【问题标题】:g++ 4.4 dereference change of const var seg faultg++ 4.4 const var seg 错误的解引用更改
【发布时间】:2013-07-23 00:38:31
【问题描述】:

我目前正在将代码从 RHEL5 移植到 RHEL6。虽然我不同意这样做,但我很好奇为什么取消引用 const var 并尝试更新它会导致 RHEL6 (g++ 4.4) 而不是 RHEL5 中的段错误。

没有 const 的程序很好 我只是好奇 const 变量在 g++ 4.4 中的存储位置有什么特别之处

这是代码和段错误

#include <math.h>

using namespace std;

const double    kPi = 2.0 * acos(0.0);

int main (int argc, char ** argv) {

(*((double *)&kPi))                     = 2.0 * acos(0.0);

}

程序收到信号SIGSEGV,分段错误。 0x000000000040068e 在 main (argc=1, argv=0x7fffffffd9b8) 在 helloconst.cpp:11 11 (*((双 *)&kPi)) = 2.0 * acos(0.0); 缺少单独的调试信息,使用:debuginfo-install glibc-2.12-1.80.el6.x86_64 libgcc-4.4.6-4.el6.x86_64 libstdc++-4.4.6-4.el6.x86_64

(gdb) bt 
#0  0x000000000040068e in main (argc=1, argv=0x7fffffffd9b8) at helloconst.cpp:11
(gdb) list
6       #include <math.h>
7       using namespace std;
8
9       const double    kPi = 2.0 * acos(0.0);
10      int main (int argc, char ** argv) {
11          (*((double *)&kPi))                     = 2.0 * acos(0.0);
12      }

(gdb)

【问题讨论】:

    标签: c++ variables g++ constants


    【解决方案1】:

    更改constvariable 会调用未定义的行为,编译器可以为所欲为。所以真的没什么好解释的,别那样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      相关资源
      最近更新 更多