C语言字符串字面量池

定义字面量时通常会将其分配在字面量池中,这个内存区域保存了组成字符串的字符序列。多次用到同一个字面量时,字面量池中通常只有一份副本。这样会减少应用程序占用的内存。通常认为字面量是不可变的,因此只有一份副本不会有什么问题。不过,认定只有一份副本或者字面量不可变不是一种好做法,大部分编译器有关闭字面量池的选项,一旦关闭,字面量可能生成多个副本,每个副本拥有自己的地址。

注意 GCC用-fwritable-strings选项来关闭字符串池。在Microsoft Visual Studio中,/GF选项会打开字符串池。

下图说明了字面量池的内存分配方式。

字符串字面量池

字符串字面量一般分配在只读内存中,所以是不可变的。字符串字面量在哪里使用,或者它是全局、静态或局部的都无关紧要,从这个角度讲,字符串字面量不存在作用域的概念。

字符串字面量不是常量的情况

在大部分编译器中,我们将字符串字面量看做常量,无法修改字符串。不过,在有些编译器中(比如GCC),字符串字面量是可修改的。看下面这个例子:

char *tabHeader = "Sound";
*tabHeader = 'L';
printf("%s\n",tabHeader); // 打印"Lound"

这样会把字面量改成"Lound",这通常不是我们期望的结果,因此应该避免这么做。像下面这样把变量声明为常量可以解决一部分问题。任何修改字符串的尝试都会造成编译时错误:

const char *tabHeader = "Sound";

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程