ホームページ > バックエンド開発 > C++ > 異なる型のポインターを介して「const」変数を変更すると、C で未定義の動作が発生するのはなぜですか?

異なる型のポインターを介して「const」変数を変更すると、C で未定義の動作が発生するのはなぜですか?

Susan Sarandon
リリース: 2024-12-08 16:21:10
オリジナル
493 人が閲覧しました

Why Does Modifying a `const` Variable Through a Pointer of a Different Type Lead to Undefined Behavior in C  ?

同じアドレスで値を変更する変数: 未定義の動作を理解する

C では、異なるデータ型の変数が同じメモリ アドレスを占有することができます。予想外の結果につながります。次のコードを考えてみましょう。

const int a1 = 40;
const int* b1 = &a1;
char* c1 = (char *)(b1);
*c1 = 'A';
int *t = (int*)c1;

cout << a1 << " " << *t << endl;
cout << &a1 << " " << t << endl;
ログイン後にコピー

このコードを実行すると、a1 と *t の両方の値が 40 になり、&a1 と t のアドレスが同じになることが予想されます。ただし、出力は驚くべきものです:

40 65 
0xbfacbe8c 0xbfacbe8c
ログイン後にコピー

同じアドレスにある変数が 2 つの異なる値を生成することはどのように可能ですか?

説明

この動作は、コード内の未定義の動作が原因で発生します。具体的には、a1 のような const 変数の変更は未定義の動作です。 C 標準 (セクション 7.1.6.1) では、const オブジェクトの存続期間中にそのオブジェクトを変更しようとすると、未定義の動作が発生することが明示的に規定されています。

この場合、*c1 (a1 を指す) を変更することで、次のようになります。 const 変数を効果的に変更しました。これが、コンパイラが期待される動作を保証できず、代わりに予測不可能な結果を​​生成する理由です。

そのような場合に考えられる動作は、標準のセクション 1.3.24 で指定されています。これらは、状況を完全に無視することから、エラー メッセージを表示してプログラムを終了することまで多岐にわたります。この場合、コンパイラは a1 と *t に異なる値を生成することを選択しました。

結論

C コードでは未定義の動作を避ける必要があります。予期せぬ一貫性のない結果が生じる可能性があります。この特定のシナリオでは、別の型のポインターを介して const 変数にアクセスし、それを変更すると、未定義の動作と予測できない出力が発生しました。

以上が異なる型のポインターを介して「const」変数を変更すると、C で未定義の動作が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート