如何用C编译字符串文字?

如何用C编译字符串文字? 根据我的理解,在test1中,字符串“hello”由编译器放入数据段,在第二行p中分配硬编码的虚拟地址。 它是否正确? 并且test1的工作方式和test2的工作原理之间没有基本的区别。

一些代码:

#include  test1(); test2(); test3(); main() { test1(); test2(); //test3(); } test1() { char *p; p="hello"; } test2() { char *p="hello"; } test3() { char *p; strcpy(p,"hello"); } 

任何来自C标准的参考都将非常感激,因此我可以从编译器的角度深入理解这一点。

从C标准的角度来看,没有特别要求文字字符串的放置位置。 关于字符串文字存储的唯一要求是在C99 6.4.5 / 5“字符串文字”中:

  • “一组静态存储持续时间和长度恰好足以包含序列”,这意味着文字将具有与程序一样长的生命周期。
  • “如果这些数组的元素具有适当的值,则未指定这些数组是否相同”,这意味着示例中的各种"hello"文字可能具有相同的地址,也可能不具有相同的地址。 你不能指望任何一种行为。
  • “如果程序试图修改这样的数组,则行为未定义”,这意味着您无法更改字符串文字。 这是强制执行的许多平台(如果您尝试这样做,程序将崩溃)。 在某些平台上,更改似乎可行,因此您无法指望错误很明显。

您的理解是正确的,“Hello”的数据将被放入RO段,其相对虚拟地址将被分配给testX()函数中的指针。

但是,这些是特定于编译器的观点,C标准并不关心它们。

编辑:Per test3(),参见τεκ的评论。