3

関数から文字列を返す方法について混乱しています。

char* someFunction()
{
  return "Hello, World"
}

上記のreturnステートメントは「関数はローカル変数のアドレスを返します」をスローすべきではありませんか、そしてそれは関数とどのように違うのですか:

char* newFunction()
{
  char temp[] = "Hello, World";
  return temp;
}

実際には、上記の警告が表示されます。

4

2 に答える 2

5

最初のケースでは、文字列は常に固定アドレスの一定の読み取り専用メモリに存在します。2 番目のケースでは、文字列はスタックにローカルに置かれるため、一時的です。

于 2012-06-18T17:47:40.900 に答える
1

文字列リテラルには静的な保存期間があります。文字列へのポインターを返し、文字列にアクセスできます。これは完全に有効で定義された動作です。

char* someFunction()
{
  return "Hello, World"
}

以下のケースでは、自動保存期間を持つ文字列へのポインタを返しています。自動保存期間を持つオブジェクトは、それが定義されているブロックを終了した後に破棄されます。したがって、関数が戻った後にアクセスすることは未定義の動作です。

char* newFunction()
{
  char temp[] = "Hello, World";
  return temp;
}
于 2012-06-18T17:57:50.410 に答える