-2

文字列を受け取る必要があるメイン関数があります。

main()
{
    char *c = fun();
}

char* fun()
{
    char a[] = "hello";
    return a;
}

問題は、長さが 3 以下の文字列を返す場合、すべてが正常であることです。長さ > 3 の文字列を返すと、文字列と共にガベージ値を受け取ります。何故ですか ?

4

4 に答える 4

3

ローカル変数へのポインターを返します。変数はスタックに割り当てられ、関数が終了すると破棄されます。このようなポインターの使用は未定義の動作です。

于 2013-06-17T20:25:26.363 に答える
1
char* fun()
{
    char a[] = "hello";
    return a;
}

配列aには自動保存期間があります。関数の最後で、配列オブジェクトaは破棄されます。これは、関数の終了時にポインターが無効になり、それを使用すると未定義の動作になることを意味します。

于 2013-06-17T20:25:26.240 に答える
1

あなたは自動変数を返していますが、これは大したことではありません。それがまったく機能するのは、実装の偶然です。

于 2013-06-17T20:25:29.177 に答える
0

変数aは に対してローカルfun()であるため、戻ったときにスコープ外 (および存在しなくなります) になります。どのような場合でも機能するという事実は、純粋な運です。a静的にするか、動的に割り当てるか、別の方法で修正することができます。

于 2013-06-17T20:27:06.423 に答える