关于字符串的特别说明
关于字符串常量的特别说明
假设您创建并运行以下两个代码片段
Fragment 1 { char *s; s="hello"; printf("%s\n",s); } Fragment 2 { char s[100]; strcpy(s,"hello"); printf("%s\n",s); }
这两个片段产生相同的输出,但它们的内部行为却截然不同。在片段 2 中,您不能写 s="hello";。要了解这些差异,您必须了解 C 语言中字符串常量表的工作原理。
广告
当您的程序被编译时,编译器会生成目标代码文件,其中包含您的机器码以及程序中声明的所有字符串常量的表。在片段 1 中,语句 s="hello"; 使 s 指向字符串常量表中字符串 hello 的地址。由于此字符串位于字符串常量表中,因此从技术上讲是可执行代码的一部分,您无法修改它。您只能指向它并以只读方式使用它。
在片段 2 中,字符串 hello 也存在于常量表中,因此您可以将其复制到名为 s 的字符数组中。由于 s 不是指针,语句 s="hello"; 在片段 2 中将不起作用。它甚至无法编译。
关于在字符串中使用 malloc 的特别说明
假设您编写了以下程序
int main() { char *s; s=(char *) malloc (100); s="hello"; free(s); return 0; }
它编译正常,但当您运行它时,在 free 行会发生段错误。malloc 行分配了一个 100 字节长的块并使 s 指向它,但现在 s="hello"; 这行成了问题。这在语法上是正确的,因为 s 是一个指针;但是,当执行 s="hello"; 时,s 指向字符串常量表中的字符串,而分配的块则被孤立。由于 s 指向字符串常量表,因此字符串无法更改;free 失败是因为它无法释放可执行区域中的块。
正确的代码如下
int main() { char *s; s=(char *) malloc (100); strcpy(s,"hello"); free(s); return 0; }