从类似的问题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'字符串(可能还包括字符串文字),以及初始化数据段中的可写字符串是很常见的。 –