我知道程序中使用的字符串文字会在只读区域中存储,例如。
//global
const char *s="Hello World \n";
此处字符串文字“Hello World \ n”在程序的只读区域中获取存储空间。 现在假设我在某些函数体中声明了一些文字,比如
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]的地址,而在第二次调用中,我不确定实际发生了什么。字符串文字“查尔斯”在哪里获得存储空间。是否有一些temperory是由编译器创建的,它的地址是通过传递还是其他事情发生? 我发现文字存储在“只读数据”部分中 String literals: Where do they go? 但我不清楚这种情况是仅发生在全局文字还是某些函数本地的文字中。任何见解都会很明显。谢谢。
答案 0 :(得分:3)
C字符串文字表示char[len+1]
类型的数组对象,其中len
是长度,加上终止'\0'
的1。此数组对象具有静态存储持续时间,这意味着它对于程序的整个执行是存在的。无论字符串文字出现在何处,都适用。
文字本身是一种表达类型char[len+1]
。 (在大多数但不是所有上下文中,它将被隐式转换为指向第一个字符的char*
值。)
编译器可以通过例如仅存储一次相同的字符串文字来优化它,或者如果它们从未被引用则根本不存储它们。
如果你这样写:
const char *s="Hello World\n";
在函数内部,文字的含义如上所述。指针对象s
被初始化为指向数组对象的第一个字符。
由于历史原因,字符串文字在C中不是const
,但尝试修改相应的数组对象具有未定义的行为。正如你在这里所做的那样,声明指针const
不是必需的,但这是一个很好的主意。
答案 1 :(得分:1)
其中字符串文字(或者更确切地说,它们被编译到的字符数组)位于内存中是编译器中的实现细节,因此如果您正在考虑C标准所保证的内容,它们可能位于在程序中以不同方式使用的地方和字符串文字最终会出现在不同的地方。
但在实践中,大多数编译器会将所有字符串文字都视为相同,并且它们可能都会以只读段结尾。因此,用作函数参数或在函数内部使用的字符串文字将存储在与“全局”函数相同的位置。