C 语言中的字符串是如何编译的?

xyz*_*xyz 4 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");
}
Run Code Online (Sandbox Code Playgroud)

任何来自 C 标准的参考都将不胜感激,这样我就可以从编译器的角度深入理解这个东西。

Mic*_*urr 5

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

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