以下に示す簡単な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
。不注意で申し訳ありません。