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



第一个声明如下

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 中。

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

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

最新更新