0

我知道程序中使用的字符串文字会存储在只读区域中,例如。

//global
const char *s="Hello World \n";

这里字符串文字 "Hello World\n" 存储在 program 的只读区域中。现在假设我在某些函数的主体中声明了一些文字,例如

func1(char *name)
{
    const char *s="Hello World\n";
}

由于函数的局部变量存储在该函数的激活记录中,字符串文字也是如此吗?再次假设我从某个函数 func2 调用 func1 作为

func2()
{
    //code
    char *s="Mary\n";

    //call1
    func1(s);

    //call2
    func1("Charles");

    //code
}

在上面,在第一次从 func2 调用 func1 时,传递了“s”的起始地址,即 s[0] 的地址,而在第二次调用中,我不确定实际发生了什么。字符串文字“Charles”在哪里获得存储空间。编译器是否创建了一些temporory并且它的地址被传递或发生了其他事情?我发现文字在字符串文字的“只读数据”部分中存储 :它们去哪儿了? 但我不清楚这是否只发生在全局文字或某些函数的本地文字上。任何见解都将是可观的。谢谢你。

4

2 回答 2

3

AC 字符串字面量表示类型为 的数组对象char[len+1],其中len是长度,加上 1 表示终止'\0'。该数组对象具有静态存储持续时间,这意味着它存在于程序的整个执行过程中。无论字符串文字出现在何处,这都适用。

文字本身是一种表达式类型char[len+1]。(在大多数但不是所有情况下,它将被隐式转换为char*指向第一个字符的值。)

编译器可以通过例如只存储一次相同的字符串文字来优化这一点,或者如果它们从未被引用,则根本不存储它们。

如果你这样写:

const char *s="Hello World\n";

在函数内部,字面的含义如我上面所述。指针对象s被初始化为指向数组对象的第一个字符。

由于历史原因,字符串文字不在constC 中,但尝试修改相应的数组对象具有未定义的行为。正如您在此处所做的那样声明指针const不是必需的,但这是一个绝妙的主意。

于 2013-10-29T20:01:31.887 回答
1

字符串文字(或者更确切地说,它们被编译成的字符数组)位于内存中的位置是编译器中的一个实现细节,因此,如果您正在考虑 C 标准所保证的内容,它们可能位于许多地方,并且程序中以不同方式使用的字符串文字可能会出现在不同的地方。

但在实践中,大多数编译器都会对所有字符串文字一视同仁,并且它们可能都以只读段结尾。因此,用作函数参数或在函数内部使用的字符串文字将存储在与“全局”字符串相同的位置。

于 2013-10-29T19:40:22.253 回答