こんにちは私は少し混乱しています
char *func()
{
return "Hello";
}
ここで「こんにちは」は文字のシーケンス/配列です。これはローカル変数であり、関数が戻るとすぐに消えなければなりません。では、なぜ正しい値を取得できるのでしょうか。
こんにちは私は少し混乱しています
char *func()
{
return "Hello";
}
ここで「こんにちは」は文字のシーケンス/配列です。これはローカル変数であり、関数が戻るとすぐに消えなければなりません。では、なぜ正しい値を取得できるのでしょうか。
は"Hello"
文字列リテラルであり、プログラムの存続期間中存在します。C99 標準の関連セクションを引用するには:
...次に、マルチバイト文字シーケンスを使用して、シーケンスを格納するのに十分な静的ストレージ期間と長さの配列を初期化します...
識別子が外部リンケージまたは内部リンケージで宣言されているか、ストレージ クラス指定子 static で宣言されているオブジェクトには、静的ストレージ期間があります。その存続期間はプログラムの実行全体であり、格納された値はプログラムの起動前に一度だけ初期化されます。
関数の戻り値はconst char*
、文字列リテラルを変更しようとする試みが未定義の動作であるためです。
それは一定であり、メモリ内に一定のアドレスがあります。
この関数は、コントロールを返した後にのみ値を破棄します。
したがって、return ステートメントに遭遇するまでに、"Hello" が戻り値に配置され、関数はスコープを破棄します。
これを見てください:機能安全で移植可能な文字列リテラルアドレスを返していますか?
文字列が削除された場合でも (ローカル変数または malloc() および free() を使用した動的割り当て)、ポインターを返すと、値は正しい場合があります。ただし、これは未定義の動作です。