変換単位全体での文字列リテラル アドレスの一貫性
C プログラミングでは、文字列リテラルはプログラムの読み取り専用メモリに格納される文字の定数配列です。 。多くの場合、同じテキストを参照する同一の文字列リテラルは同じメモリ アドレスを持つと想定されます。ただし、翻訳単位 (オブジェクト ファイルにコンパイルされた個別のソース ファイル) 間でこの前提に依存することは保証されません。
標準仕様
C99 および C ドラフト標準では、明示的に次のように述べられています。文字列リテラルの区別は実装で定義されるということです。これは、コンパイラが同一の文字列リテラルを別のオブジェクトに保存するか、メモリを節約するためにプールするかを選択できることを意味します。
コンパイラの動作
GCC や Visual Studio などの一部のコンパイラ、コンパイル単位間の文字列リテラル プーリングをサポートします。ただし、この動作は最適化設定とコンパイラ オプションによって異なる場合があります。たとえば、GCC の -fmerge-constants フラグを使用するとリテラルのマージが可能になり、Visual Studio の /GF オプションを使用すると文字列プールが可能になります。
翻訳単位内の信頼性
単一の翻訳単位内(一緒にコンパイルされた単一のソース ファイル)、同一の文字列リテラルが同じアドレスを持つと想定する方が信頼性が高くなります。ただし、これもコンパイラと最適化レベルによって異なる場合があります。
移植性がない理由
翻訳単位間で文字列リテラルの一意性を義務付けないという決定は、次のような理由から生じました。当時の多様な実装慣行。実装によっては、文字列リテラルを ROM または定数データ セクションに保存するため、一意性を保証することが現実的ではありません。
実際的な考慮事項
同じアドレスの仮定に依存することは、次のような場合に便利です。場合によっては、文字列リテラルを個別のオブジェクトとして扱うことが最も安全である場合があります。これにより移植性が確保され、潜在的な実行時の問題が回避されます。
以上が同一の文字列リテラルは、C の翻訳単位間で常に同じアドレスを持ちますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。