文字列を受け取る必要があるメイン関数があります。
main()
{
char *c = fun();
}
char* fun()
{
char a[] = "hello";
return a;
}
問題は、長さが 3 以下の文字列を返す場合、すべてが正常であることです。長さ > 3 の文字列を返すと、文字列と共にガベージ値を受け取ります。何故ですか ?
文字列を受け取る必要があるメイン関数があります。
main()
{
char *c = fun();
}
char* fun()
{
char a[] = "hello";
return a;
}
問題は、長さが 3 以下の文字列を返す場合、すべてが正常であることです。長さ > 3 の文字列を返すと、文字列と共にガベージ値を受け取ります。何故ですか ?
ローカル変数へのポインターを返します。変数はスタックに割り当てられ、関数が終了すると破棄されます。このようなポインターの使用は未定義の動作です。
char* fun()
{
char a[] = "hello";
return a;
}
配列a
には自動保存期間があります。関数の最後で、配列オブジェクトa
は破棄されます。これは、関数の終了時にポインターが無効になり、それを使用すると未定義の動作になることを意味します。
あなたは自動変数を返していますが、これは大したことではありません。それがまったく機能するのは、実装の偶然です。
変数a
は に対してローカルfun()
であるため、戻ったときにスコープ外 (および存在しなくなります) になります。どのような場合でも機能するという事実は、純粋な運です。a
静的にするか、動的に割り当てるか、別の方法で修正することができます。