2010-02-15 64 views
4

我是一个有点困惑这个表达式:C是否在堆栈上创建字符串文字?

char *s = "abc"; 

是否字符串文字得到栈上创建的?

我知道,这表达

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

分配上的堆内存,这表达

char s[] = "abc"; 

在栈上分配内存,但我完全不能确定第一个表达式做什么。

回答

21

通常,字符串文字​​存储在可执行文件的只读部分。指针s将在堆栈上创建(或放置在一个寄存器中,或者只是优化掉) - 并指向那个位于“别处”的字符串字面值。

+1

注意,即使s是char *而不是char const,也不能修改字符串“abc”。 – AProgrammer 2010-02-15 15:21:31

+0

实际上,使用char *来引用只读常量被认为已被弃用。还有一个编译器警告它。新软件应该使用const char * – Thorsten79 2010-02-15 15:53:03

+0

除了“只读部分可执行文件”之外,还有其他可执行文件吗?也许“只读存储器”不那么令人困惑。 – alexkr 2010-02-15 16:04:01

6
"abc" 

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

char *s = "abc"; 

本声明将分配字符串文字​​到s的存储位置,即s到只读存储器区域。

3

“堆栈”和“堆”是实现细节并取决于平台(全世界都是而不是 x86)。从语言POV来看,重要的是存储类别和范围。

字符串文字有静态程度;在程序启动时分配它们的存储空间,直到程序终止。它也假定字符串文字不能被修改(试图这样做调用未定义的行为)。将其与本地的块范围(自动)变量进行对比,这些变量的存储在块输入时分配并在块出口处释放。通常,这意味着字符串文字不会存储在与块范围变量相同的内存中。

相关问题