正確な場所は、オブジェクトファイル形式(PE対ELF対COFF)とコマンドラインオプション(文字列リテラルを書き込み可能なメモリセグメントに格納できるものもあります)によって異なります。 ELFはそれを.rodata
セグメントに格納します。このセグメントは、その名前が示すように、読み取り専用です。
同じ文字列リテラルの複数のインスタンス同じ場所にマップしますが、必須ではありませんAFAIK(私は同じリテラルの複数のインスタンスを作成するコンパイラは認識していませんが、私の経験はそうではありません広い)。
特定されているもの:
- プログラムが終了するまで、文字列リテラルのためのスペースは、プログラムの起動時に割り当てられた(通常はプログラムがメモリにロードされたとき)と開催されます。
- 文字列リテラル呼び出す未定義の動作の内容を変更しようとすると - あなたのコードはセグメンテーション違反したり、意図した通りに動作すること、またはそれはあなたのハードドライブを再フォーマットしたり、それがゾンビの黙示録をトリガすることができます。あなたのコードにバグがあり
注 - s
に意味のあるアドレスを割り当てることはありませんので、strcpy
は、本質的に再び未定義の動作でランダムな位置に文字列"here"
を書き込もうとしています。
s
にリテラルを指すように設定している可能性があります。そうでない場合には、s
は、文字列を保持するのに十分な大きさの配列である必要はあります次のいずれか
char s[sizeof "here"]; // sizeof evaluated at compile time
か、動的に領域を割り当てる必要があります:
char *s = malloc(strlen("here") + 1);
if (s)
strcpy(s, "here");
リテラルが 'に割り当てられています。ロナタ。または、短い文字列であり、レジスタに収まるので、割り当てられないことさえあります。しかし、あなたのコードは、とにかく無効です。 's'は全く割り当てられていないからです。 –