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