プログラムで使用される文字列リテラルは、たとえば読み取り専用領域に格納されることを知っています。
//global
const char *s="Hello World \n";
ここで、文字列リテラル "Hello World\n" は、 program の読み取り専用領域にストレージを取得します。ここで、次のような関数の本体でリテラルを宣言するとします。
func1(char *name)
{
const char *s="Hello World\n";
}
関数へのローカル変数はその関数のアクティベーション レコードに格納されるため、これは文字列リテラルの場合も同じですか? ここでも、関数 func2 から func1 を次のように呼び出すとします。
func2()
{
//code
char *s="Mary\n";
//call1
func1(s);
//call2
func1("Charles");
//code
}
上記の func2 からの func1 の最初の呼び出しでは、「s」の開始アドレス、つまり s[0] のアドレスが渡されますが、2 回目の呼び出しでは実際に何が起こるかわかりません。文字列リテラル "Charles" はどこに格納されますか。コンパイラによっていくつかの一時が作成され、そのアドレスが渡されるか、それとも何か他のことが起こるか? 文字列リテラルから「読み取り専用データ」セクションにリテラルが格納されることがわかりました 。どこに行くのですか? しかし、それがグローバルリテラルでのみ発生するのか、それとも一部の関数に対してローカルなリテラルでも発生するのかは不明です。どんな洞察もかなりのものです。ありがとうございました。