翻訳単位間の文字列リテラル アドレスの不一致
C および C では、異なる翻訳単位 (オブジェクト ファイル) 内の文字列リテラルが一致すると想定されることがよくあります。コンパイル中に作成される)は同じメモリアドレスを持ちます。ただし、この考え方はコンパイラや実装間で移植可能ではありません。
C99 および C ドラフト標準によれば、同一の文字列リテラルに関する動作は明示的に未指定のままです。これは、コンパイラがそれらを自由にプールまたはマージしたり、参照ごとに個別のインスタンスを作成したりできることを意味します。
Visual Studio では、/GF コンパイラ オプションを使用して文字列リテラルのプールを明示的に許可していますが、GCC は -fmerge-constants でそれをサポートしています。フラグ。ただし、両方のコンパイラは、特定のハードウェアまたはリンカー サポートの可用性に応じて、条件付きでこの機能を使用します。
したがって、異なる変換単位間で文字列リテラルに対して同じメモリ アドレスに依存することは移植性がありません。同じ翻訳単位内であっても、文字列リテラルを扱う際にコンパイラの最適化により予期せぬ動作が発生する可能性があります。
この標準化の欠如は、言語開発時の C 実装の多様性に起因します。 ROM ベースのシステムでは、文字列リテラルを読み取り専用メモリに保存する必要があるため、文字列リテラルの一意性と書き込み可能性を保証することは非現実的であると考えられていました。
以上が複数の翻訳単位にまたがる文字列リテラルのメモリ アドレスが異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。