给定字符串分配不同内存的原因是什么?

时间:2014-01-30 14:18:43

标签: c string pointers memory char

第一个声明如下

char*str="hello";

在这种情况下,字符串文字存储在只读存储器中。

第二项声明如下

char str[10]="name";

在这种情况下,字符串文字存储在可写存储器中。

为什么分配的内存与两个字符串文字有区别?

3 个答案:

答案 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。

如果只需要读取该常量文字,那么指针引用就足够了。

但是只要你需要对它进行修改,那么你需要制作副本,就像在第二个声明中那样,在范围开始时将该字符串文字复制到堆栈上。