ZHCUAQ1F july 2015 – april 2023
在 C 语言中,字符串常量用于下述方式之一::
char s[] = "abc";
当字符串用作初始化值时,其被简单地视为初始化数组;每个字符都是一个单独的初始化值。更多有关初始化的信息,请参阅节 8.9。
strcpy (s, "abc");
在表达式中使用字符串时,字符串本身是在.const:string 段中使用 .string 汇编器指令定义的,并带有指向该字符串的唯一标签;编译器明确添加终止 0 字节。例如,以下行定义了字符串 abc 和终止 0 字节(标签 SL5 指向该字符串):
.sect ".const:string"
$C$SL5: .string "abc",0
字符串标签的形式为 $C$SLn,其中 $C$ 是编译器生成的符号前缀,n 是编译器分配的数字,用于使标签唯一。该数字从 0 开始,每定义一个字符串就增加 1。源模块中使用的所有字符串都在编译后的汇编语言模块的末尾定义。
标签 $C$SLn 表示字符串常量的地址。编译器使用此标签引用字符串表达式。
由于字符串存储在 .const 段中(可能在 ROM 中)并被共享,因此对于程序来说修改字符串常量是一种不好的做法。以下代码是错误使用字符串的示例:
const char *a = "abc"
a[1] = 'x'; /* Incorrect! undefined behavior */