如何在C中编译字符串文字?

时间:2011-07-13 14:49:13

标签: c

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

一些代码:

#include <stdio.h>

test1();
test2();
test3();

main()
{
    test1();
    test2();
    //test3();
}

test1()
{
    char *p;
    p="hello";
}

test2()
{
    char *p="hello";
}

test3()
{
    char *p;
    strcpy(p,"hello");
}

任何来自C标准的参考都将受到高度赞赏,因此我可以从编译器的角度深入理解这一点。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

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