5

重複の可能性:
関数セーフでポータブルな文字列リテラル アドレスを返していますか?
C の文字列リテラルの「寿命」

こんにちは私は少し混乱しています

char *func()
 {

    return "Hello";
 }

ここで「こんにちは」は文字のシーケンス/配列です。これはローカル変数であり、関数が戻るとすぐに消えなければなりません。では、なぜ正しい値を取得できるのでしょうか。

4

4 に答える 4

10

"Hello"文字列リテラルであり、プログラムの存続期間中存在します。C99 標準の関連セクションを引用するには:

  • 6.4.5 文字列リテラル

...次に、マルチバイト文字シーケンスを使用して、シーケンスを格納するのに十分な静的ストレージ期間と長さの配列を初期化します...

  • 6.2.4 オブジェクトの保存期間

識別子が外部リンケージまたは内部リンケージで宣言されているか、ストレージ クラス指定子 static で宣言されているオブジェクトには、静的ストレージ期間があります。その存続期間はプログラムの実行全体であり、格納された値はプログラムの起動前に一度だけ初期化されます。

関数の戻り値はconst char*、文字列リテラルを変更しようとする試みが未定義の動作であるためです。

于 2012-08-27T09:08:09.190 に答える
1

それは一定であり、メモリ内に一定のアドレスがあります。

于 2012-08-27T09:05:25.607 に答える
0

この関数は、コントロールを返した後にのみ値を破棄します。

したがって、return ステートメントに遭遇するまでに、"Hello" が戻り値に配置され、関数はスコープを破棄します。

于 2012-08-27T09:08:37.507 に答える
-1

これを見てください:機能安全で移植可能な文字列リテラルアドレスを返していますか?

文字列が削除された場合でも (ローカル変数または malloc() および free() を使用した動的割り当て)、ポインターを返すと、値は正しい場合があります。ただし、これは未定義の動作です。

于 2012-08-27T09:09:55.853 に答える