C では、文字列オブジェクトの操作には、注意深い考慮を必要とする特定のニュアンスが存在します。そのような例の 1 つは、以下のコード スニペットに示されているように、std::string 関数内で C 文字列リテラルを使用することです。
<code class="cpp">std::string myFunction() { return "it's me!!"; }</code>
前述したように、戻り値はstd::string コンストラクター内のステートメントは、内部文字列オブジェクトを const 文字配列で暗黙的に初期化します。返された文字列オブジェクトは、関数呼び出しの終了時に割り当てが解除される一時変数によって参照されます。
ただし、その後の文字列の使用には、そのデータへのアクセスが必要です。 c_str() メソッドは、内部 C スタイルの文字列表現へのポインタを提供します。
文字列オブジェクトの割り当て解除による潜在的な問題についての懸念は正当です。理論的には、一時文字列オブジェクトが破棄されると、c_str() が指すメモリは無効になる可能性があります。ただし、実際には、観察される動作は異なります。
この予期しない動作の理由は、オペレーティング システムが果たす役割にあります。 C でメモリの割り当てが解除されると、オペレーティング システムは必ずしもその内容をすぐに消去するとは限りません。代わりに、メモリが今後使用できるものとしてマークされ、コンテンツに一時的にアクセスできるようになります。
提供したコードはエラーなく動作しているように見えますが、次のカテゴリに分類されます。 C での未定義の動作。正確な結果は、特定のオペレーティング システムとランタイム環境によって異なる場合があります。堅牢で予測可能なコードを確保するには、ベスト プラクティスに従い、未定義の動作への依存を避けることが重要です。
以上が関数から文字列リテラルを返す C コードが、動作が未定義であるにもかかわらず機能するように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。