從類似的問題here我看到不斷變量必須在程序的進程內存文本段,如果我理解一切正確的 - 這真的是:C - 常量位於進程的內存中?
int main() {
static const char somedata[8192] = "somedata";
while (1) {
printf("\tAddress of main: %p\n", main);
printf("\tMy process ID : %d\n", getpid());
printf("\tArray Some first address: %p\n", &somedata[1]);
sleep(10);
};
return 0;
}
這給了我結果:
Address of main: 0x4bc38b971a My process ID : 633 Array Some first address: 0x4bc38b9881
它運行後 - /proc/maps
證實了這一點:
$ cat /proc/633/maps 4bc38b9000-4bc38bc000 r-xp 00000000 fe:01 19664256
0x4bc38b9881
是12月,0x4bc38b9000 - 0x4bc38bc000
是325403250688-325403262976和是這些邊界之間,一切看起來是正確的。
的size
還告訴它在text
:
$ size mem_lay_inc_text_print text data bss dec hex filename 10097 608 8 10713 29d9 mem_lay_inc_text_print
但this(和很多類似的)話題說 - 不變在初始化數據段而不是在Code segment:
個初始化的數據存儲所有全球性的,靜態的,不斷,
所以 - 其中的道理是什麼?或者我只是誤解了一些東西?
也許4bc38b9000-4bc38bc000包含Init。數據和文本段?
不,這不:
...
static int i = 100;
while (1) {
printf("Address of main: %p\n", main);
printf("My process ID : %d\n", getpid());
printf("Array Some first address: %p\n", &somedata[1]);
printf("Int I address: %p\n", &i);
...
現在從size
的結果我看到data
成爲(從第一個結果data 612
代替608
)更大,maps
也表示相同的:
... Int I address: 0xea335af040 ...
and maps
:
$ cat /proc/8859/maps ea333ac000-ea333af000 r-xp 00000000 fe:01 19664256 ea335ae000-ea335af000 r--p 00002000 fe:01 19664256 ea335af000-ea335b0000 rw-p 00003000 fe:01 19664256
0xea335af040是在ea335af000-ea335b0000與rw-p
,這是data
...
真的在這裏感到困惑......
$ gcc --version gcc (GCC) 7.1.1 20170630
所以問題是:常量的存儲位置 - 初始化數據還是文本段?或者它取決於編譯器/操作系統?
實際問題是什麼?常量將位於鏈接器放置它們的位置。 – tilz0R
@ tilz0R常量存儲 - 初始化數據或文本段? – setevoy
基本上它取決於編譯器。我不再關注這個東西 - 這是編譯器的工作,爲什麼要擔心它? - 但我相信現在在文本段中放置'const'字符串(可能還包括字符串文字),以及初始化數據段中的可寫字符串是很常見的。 –