我知道程序中使用的字符串文字将存储在eg的只读区域中。
//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]的地址,而在第二次调用中,我不确定实际发生了什么。字符串“Charles”在哪里得到存储。是编译器创建了一个临时函数,它的地址被传递了,还是发生了其他事情?
我在“只读数据”部分找到了从
String literals: Where do they go?
但我不清楚这种情况是只发生在全局文本还是发生在某些函数的本地文本。任何洞察都是可贵的。谢谢您。
最佳答案
C字符串文本表示char[len+1]
类型的数组对象,其中len
是长度,加1表示终止'\0'
。此数组对象具有静态存储持续时间,这意味着它存在于程序的整个执行过程中。无论字符串文本出现在何处,都会应用此选项。
文本本身是表达式类型char[len+1]
。(在大多数但不是所有上下文中,它将隐式转换为指向第一个字符的char*
值。)
例如,编译器可以通过只存储一次相同的字符串文本,或者如果从未被引用,则根本不存储它们来优化此操作。
如果你写这个:
const char *s="Hello World\n";
在函数内部,字面的含义如我上面所述。指针对象
s
初始化为指向数组对象的第一个字符。由于历史原因,字符串文本在C中不
const
,但是试图修改相应的数组对象有未定义的行为。像您在这里所做的那样,声明指针const
不是必需的,但这是一个很好的主意。关于c - 传递给函数调用的字符串文字在哪里存储在c中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19667562/