C是否在堆栈上创建了字符串文字?

时间:2010-02-15 15:14:30

标签: c

我对这个表达有点困惑:

char *s = "abc";

是否在堆栈上创建了字符串文字?

我知道这个表达

char *s = (char *)malloc(10 * sizeof(char));

在堆上分配内存和此表达式

char s[] = "abc";

在堆栈上分配内存,但我完全不确定第一个表达式的作用。

3 个答案:

答案 0 :(得分:21)

通常,字符串文字"abc"存储在可执行文件的只读部分中。指针s将在堆栈上创建(或放置在寄存器中,或者只是优化掉) - 并指向生活在“其他地方”的字符串文字。

答案 1 :(得分:6)

"abc"

如果启用了字符串池,则字符串文字存储在程序的__TEXT,__cstring(或rodata或任何取决于对象格式的部分)部分。这意味着它既不在堆栈上,也不在堆中,而是粘在代码附近的只读内存区域。

char *s = "abc";

此语句将字符串文字"abc"的内存位置分配给s,即s points 到只读内存区域。< / p>

答案 2 :(得分:3)

“Stacks”和“堆”是实现细节,取决于平台(世界上所有 x86)。从语言POV来看,重要的是存储类和范围。

字符串文字具有静态范围;它们的存储在程序启动时分配并保持到程序终止。还假设不能修改字符串文字(尝试这样做会调用未定义的行为)。将此与本地块范围(自动)变量进行对比,这些变量的存储在块条目上分配并在块退出时释放。通常,这意味着字符串文字不会与块范围变量存储在同一内存中。