2013-07-23 22 views
0

我正在將代碼從RHEL5移植到RHEL6。雖然我不同意這樣做,但我很好奇爲什麼解引用const var並嘗試更新它會導致RHEL6(g ++ 4.4)中的段錯誤而不是RHEL5。g ++ 4.4取消引用const var seg的錯誤更改

程序不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的段錯誤,分段故障。 (*((double *)& kPi))= 2.0 * acos(0.0);在這個例子中,主函數argc = 1,argv = 0x7fffffffd9b8 0x0500000040068e在helloconst.cpp中: 0x000000000040068e 缺少單獨debuginfos,使用:debuginfo軟安裝的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 )

回答

2

更改const變量調用未定義的行爲,編譯器可以做任何他們想要的。所以沒有什麼可以解釋的,不這樣做。