在这两种情况下,编译器在程序部分
"hello"仅发出一次字符串的实际字节
.rodata( rodata 代表 只读数据 )。
它们实际上是直接从可执行文件映射到内存的,有点类似于代码部分。这就是为什么它们与动态分配的相距甚远的原因。
然后:
char *p = "hello";
只需将其初始化
p为该(只读)数据的地址。显然:
char *q = "hello";
获取完全相同的地址。这称为 字符串池 ,是编译器的可选流行优化。
但是当你写:
char p[] = "hello";
它可能会生成如下内容:
char p[6];memcpy(p, "hello", 6);
作为
"hello"只读汇集字符串的实际地址。
的调用
memcpy仅出于说明目的。最好直接内联复制,而不是使用函数调用。
如果以后再做:
char q[] = "hello";
它将定义另一个数组和另一个数组
memcpy()。因此,相同的数据,但不同的地址。
但是这些数组变量将驻留在哪里?好吧,这取决于。
- 如果它们是局部的,非静态的变量:在堆栈中。
- 如果它们是全局变量:那么它们将位于
.data
可执行文件的部分中,并且将在其中保存有正确的字符,因此memcpy
在运行时不需要。很好,因为memcpy
必须在之前执行main
。 - 如果它们是局部静态变量:与全局变量完全相同。他们俩都被称为
variables of static duration
或类似的东西。
关于文档链接,对不起,我一无所知。
但是,如果您可以自己进行实验,谁需要文档?为此,最好的工具是
objdump,它可以反汇编程序,转储数据节等等!
我希望这能回答您的问题…



