第一个声明如下
char*str="hello";
在这种情况下,字符串文本存储在只读内存中。
第二项声明如下
char str[10]="name";
在这种情况下,字符串文本存储在可写内存中。
为什么分配的内存与两个字符串文字不同?
在char*str="hello";
的情况下(实际上应该通过const char*str="hello";
),实际的字符串文字作为数组存储在只读内存中,str
只是指向这一点。在第二个示例中,数组存储在全局数据段(对于全局变量)或堆栈(对于本地数据)中,没有指针。
可以这样想:
为
const char *str = "hello";
你有
+-----+ +-----------+ |STR |---> |"你好\0" | +-----+ +-----------+
而为
char str[] = "hello";
你有
+-----------+ |"你好\0" | +-----------+
与文字本身没有区别。区别在于您告诉编译器您想要的实际变量,str
.该变量具有不同的类型,因此不同的类型具有不同的表示形式。
在第一种情况下,你说"我希望str
是一个字符指针,初始化到要找到字符串"hello"
的某个地方(我不在乎在哪里)。
在第二种情况下,您说"我希望str
是一个包含 10 个字符的数组,其中前五个字符使用字符串"name"
初始化。
这些显然是完全不同的事情。在第二种情况下的程序中,字符串文本"name"
很可能仍然存在于某个只读位置,但在程序启动时会复制到str
中。
编译可执行文件时,字符串文字必须来自程序内的某个位置。因此,它们与文本一起存储在一个特殊的数据段中。由于您不希望每次执行时都修改程序文本,因此该段以只读方式映射到进程 VM 中。
如果您只需要读取该常量文本,那么指针引用就足够了。
但是一旦你需要对它进行修改,那么你需要像第二个声明一样制作副本,它会在范围开始时将该字符串文本复制到堆栈上。