2

以下に示す簡単なcコードを作成しました。このコード スニペットでは、const 文字列abcdが格納されている場所を確認します。.data最初に、読み取り専用のセクションに保存する必要があると思います。しかし、Debian でのテストの後、状況は私が最初に推測したものとは異なります。gcc で生成されたアセンブリ コードを確認すると、 function のスタック フレームに配置されていることがわかりましたp。しかし、後でOSXで試してみると、文字列が.data再びセクションに保存されます。今、私はこれに混乱しています。const 文字列を格納するための標準はありますか?

#include<stdio.h>
char *p()
{
    char p[] = "abcd";
    return p;
}

int main()
{
    char *pp = p();
    printf("%s\n",pp);
    return 0;
}

更新: rici の答えは私を目覚めさせます。OSX では、最初のリテラルが格納され.data、後で関数のスタック フレームに移動されます。したがって、この関数のローカル変数になります。ただし、Debian の gcc は、この状況を処理するため、OSX とは異なります。Debian では、gcc はリテラルを から移動するのではなく、直接スタックに格納しました.data。不注意で申し訳ありません。

4

2 に答える 2