文字列リテラルが格納される正確な場所は、個々の実装に大きく依存します。唯一の要件は、リテラルがプログラム全体から見えることと、プログラムの開始時に割り当てられ、プログラムが終了するまで保持されることです。
プラットフォームによっては、リテラルを別のメモリ セグメント ( など.rodata) に格納する場合があります。
の違いに関しては、
char *name = "Adam";
と
char name2[] = "Adam";
写真が役立つかもしれません。私の特定のシステムでの動作は次のとおりです。
Item Address 00 01 02 03
---- ------- -- -- -- --
"Adam" 0x400ac0 41 64 61 6d Adam
0x400ac4 00 22 41 64 ."Ad
name 0x7fff39dbdb78 c0 0a 40 00 ..@.
0x7fff39dbdb7c 00 00 00 00 ....
name2 0x7fff39dbdb70 41 64 61 6d Adam
0x7fff39dbdb74 00 7f 00 00 ....
文字列リテラルは、アドレス 0x400ac0 (私のシステムのセグメントにあります) から始まる"Adam"配列として格納されます。char.rodata
変数nameは文字列リテラルへのポインターであり、そのアドレスcharを含みます(私のシステムはリトルエンディアンなので、アドレスは「後方」に読み取られます)。
変数は、文字列リテラルから コピーされた内容name2の配列です。char
編集
さらに役立つのは、生成されたマシン コードを調べることです。次のプログラムを実行します。
#include <stdio.h>
int main( void )
{
char *name = "Adam";
char name2[] = "Adam";
printf("name = %s, name2 = %s\n", name, name2 );
return 0;
}
SLES 10 システムでgcc次のようにコンパイルしました。
gcc -o name2 -std=c99 -pedantic -Wall -Werror name2.c -Wa,-aldh=name2.lst
これにより、name2.lst に次のアセンブラー出力が得られました。
GAS LISTING /tmp/ccuuqqGI.s page 1
1 .file "name2.c"
2 .section .rodata
3 .LC0:
4 0000 4164616D .string "Adam"
4 00
5 .LC1:
6 0005 6E616D65 .string "name = %s, name2 = %s\n"
6 203D2025
6 732C206E
6 616D6532
6 203D2025
7 .text
8 .globl main
10 main:
11 .LFB2:
12 0000 55 pushq %rbp
13 .LCFI0:
14 0001 4889E5 movq %rsp, %rbp
15 .LCFI1:
16 0004 4883EC10 subq $16, %rsp
17 .LCFI2:
18 0008 48C745F8 movq $.LC0, -8(%rbp)
18 00000000
19 0010 8B050000 movl .LC0(%rip), %eax
19 0000
20 0016 8945F0 movl %eax, -16(%rbp)
21 0019 0FB60500 movzbl .LC0+4(%rip), %eax
21 000000
22 0020 8845F4 movb %al, -12(%rbp)
23 0023 488D55F0 leaq -16(%rbp), %rdx
24 0027 488B75F8 movq -8(%rbp), %rsi
25 002b BF000000 movl $.LC1, %edi
25 00
26 0030 B8000000 movl $0, %eax
26 00
27 0035 E8000000 call printf
27 00
28 003a B8000000 movl $0, %eax
28 00
29 003f C9 leave
30 0040 C3 ret
31 .LFE2:
ご覧のとおり、文字列リテラル"Adam"とセクション"name = %s, name2 = %s\n"に格納されてい.rodataます (読み取り専用データ項目の場合)。18 行目では文字列リテラルのアドレスを にnameコピーし、19 行目から 22 行目では文字列リテラルの内容を name2 にコピーします。