0

重複の可能性:
非constポインターを介してconstを変更する

私は次のコードを持っています:

const int x = 5;
int *p = (int*)&x;

*p = 2; // Line 1

cout << x << " - " << *p << endl;
cout << &x << " - " << p << endl;

そして結果を得ました:

5 - 2
0012FF28 - 0012FF28

私はコードが変だと知っているので、絶対にやるべきではありません。しかし、なぜ同じアドレスで結果が異なるのか疑問に思いました。そして、Line 12番目の店はどこにありますか?

4

3 に答える 3

10

constとにかく本質的に変数の値を変更することは未定義動作であるためです[参照#1]

あなたがやったら:

*p = 2; // Line 1

すべての賭けが無効になり、コードは有効なC ++コードではなくなります。その行が書き込まれると、特定の動作を期待することはできません。未定義動作が特定の動作を与える理由を推測することは、未定義動作の意味である任意の動作を示すことが許可されているため、無意味です[参照#2]


[参照番号1]
C++03標準7.1.5.1cv修飾子:
パラ4:

可変(7.1.1)と宣言されたクラスメンバーを変更できることを除いて、constオブジェクトをその存続期間(3.8)中に変更しようとすると、未定義の動作が発生します。

[参照#2]
C ++ 03標準1.3.24:

許容される未定義の動作は、予測できない結果を伴う状況を完全に無視することから、環境に特徴的な文書化された方法での翻訳またはプログラム実行中の動作(診断メッセージの発行の有無にかかわらず)、翻訳または実行の終了(発行あり)にまで及びます。診断メッセージの)。

于 2012-05-29T03:34:06.673 に答える
1

何かを宣言constすると、その値が変更されないと仮定する許可がコンパイラに与えられます。5これは、に割り当てられた場所 (存在する場合) を参照するのではなく、「即時」命令を使用して値をロードできることを意味しますx

さらに、a を変更するconstと、その「変数」が変更されないというコンパイラーへの保証に違反し、さまざまな予期しない動作が発生する可能性があります。

于 2012-05-29T03:38:43.560 に答える
1

一部のコンパイラは const 値のアドレスを割り当てますが、それにアクセスすることは絶対に禁止されています。5-2 を取得する理由は、コンパイラが x を直接 5 に置き換えているためです。これは、x が const でない場合にアドレスが指定されていたはずのアドレスを変更したにもかかわらず、p* を介して x の値にアクセスしない限り、何をしても毎回5を取得します-また、一部のコンパイラではconstのアドレスの取得が実際に失敗する可能性があるため、p *は未定義の値を生成する可能性があります(個人的には、それらすべてで失敗すると思います)

于 2012-05-29T03:41:35.587 に答える