-1

次のプログラムがあります。

#include<stdio.h>

char * test()
{
char * rt="hello";
return rt;

}

void main()
{
printf("\n %s \n", test());
}

ここでは、hello が正しく出力されますが、rt が char rt[]="hello" のような定数ポインターでない場合は、ガベージが出力されます。私の理解では、後者のスタックでは、関数がテストから戻ったときに解放されますが、上記の場合はどうなりますか? char *rt のメモリはどこに割り当てられますか?

上記の部分を拡張すると、 char rt[]="hello" を実行しようとすると、 rt="hrer" を実行しようとするとエラーがスローされますが、 char *rt="hello" では問題なく動作しますが、特定の文字を変更することはできません大文字と小文字を区別する文字列。それを理解するのを手伝ってください。ありがとう。

4

2 に答える 2

2

あなたの文字列は、文字列リテラル"hello"と呼ばれるものです。これは、メモリの領域である、プログラムのデータ セグメントと呼ばれるものにあります。コード全体の他の文字列リテラルもそこに配置されます。この領域は 1 回読み込まれ、破棄されることはありません。

したがって、ポインターrtはその領域のどこかを指しています。

ただし、 を宣言すると、スタック上で名前がchar rt[] = "hello"付けられた配列が宣言さrt[]れ、配列の長さは 6 バイトになります (hello + null ターミネータ)。関数が戻ると、スタックが解放されるため、このメモリは無効になります。

文字列リテラルの詳細については、次を参照してください: C 文字列リテラル: どこに行くの?

于 2013-10-15T20:35:30.487 に答える
1

文字列Helloは、プログラムの実行可能部分の読み取り部分に設定されます。関数はそれへのポインタを返します。

配列の使用 (2 番目のケース) は、それがスタックにコピーされることを意味します。

ザッピングされる関数の終わり - したがってゴミ

于 2013-10-15T20:28:26.880 に答える