0

プログラムで使用される文字列リテラルは、たとえば読み取り専用領域に格納されることを知っています。

//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" はどこに格納されますか。コンパイラによっていくつかの一時が作成され、そのアドレスが渡されるか、それとも何か他のことが起こるか? 文字列リテラルから「読み取り専用データ」セクションにリテラルが格納されることがわかりました 。どこに行くのですか? しかし、それがグローバルリテラルでのみ発生するのか、それとも一部の関数に対してローカルなリテラルでも発生するのかは不明です。どんな洞察もかなりのものです。ありがとうございました。

4

2 に答える 2