1

重複の可能性:
リテラル文字列はどこに配置され、それらへのポインターを返すことができるのはなぜですか?

次のようなコードがあるとします。

char *string;

void foo(char *s)
{
   string = s;
}

foo("bar");

内部で何が起こっているのですか?foo に渡すものを明示的に宣言していないため、たとえば、次のようなことを行います。

char s[] = "bar";
foo(s);

「バー」は常に同じメモリ位置に保存されますか? 自動的にメモリが割り当てられますか? もしそうなら、このアドレスは同じままなので、「文字列」は常に「バー」を保持する文字配列を指しますか?

私が尋ねているより一般的な質問は次のとおりだと思います:最初に変数に明示的に代入せずに引数を関数に渡し、次にその変数を渡すと、内部的にどうなりますか。

4

2 に答える 2

3
char *string;

void foo(char *s)
{
   string = s;
}

foo("bar");

"bar"文字列リテラルです。文字列リテラルには静的な保存期間があり、その有効期間 (静的な保存期間を持つすべてのオブジェクトと同様) はプログラムの実行全体です。

したがって、基本的に"bar"、プログラムの起動時にメモリのどこかに配列オブジェクトがあり、プログラムの実行中に最初の要素へのポインターを渡しますが、これはまったく問題ありません。

于 2012-10-20T09:57:27.293 に答える
2

あなたのコードは本質的に同等です

char *string;

string = "bar";

この状況では、適切な実装を仮定する"bar"と、文字列リテラルである は実行可能ファイルの一定の場所に格納され、(おそらく読み取り専用) メモリにロードされ、メモリ内の同じ (仮想) アドレスにもロードされますstring。常に有効な文字列を指します。

于 2012-10-20T09:57:36.300 に答える