0

現在、RHEL5 から RHEL6 にコードを移植しています。私はこれを行うことに同意しませんが、const var を逆参照して更新しようとすると、RHEL5 ではなく RHEL6 (g++ 4.4) でセグメンテーション違反が発生する理由に興味があります。

プログラムは const がなくても問題ありません。g++ 4.4 で const 変数が格納される場所について何が特別なのか知りたいだけです。

これがコードとセグメンテーションフォールトです

#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 (argc=1, argv=0x7fffffffd9b8) at helloconst.cpp:11 11 (*((double *)&kPi)) = 2.0 * acos(0.0); 個別のデバッグ情報がありません。次を使用してください:

(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)

4

1 に答える 1

2

変数を変更すると、const未定義の動作が呼び出されます。コンパイラは、必要なことを何でも実行できます。ですから、説明することは本当に何もありません。そうしないでください。

于 2013-07-23T00:46:18.253 に答える