我是一个有点困惑这个表达式:C是否在堆栈上创建字符串文字?
char *s = "abc";
是否字符串文字得到栈上创建的?
我知道,这表达
char *s = (char *)malloc(10 * sizeof(char));
分配上的堆内存,这表达
char s[] = "abc";
在栈上分配内存,但我完全不能确定第一个表达式做什么。
我是一个有点困惑这个表达式:C是否在堆栈上创建字符串文字?
char *s = "abc";
是否字符串文字得到栈上创建的?
我知道,这表达
char *s = (char *)malloc(10 * sizeof(char));
分配上的堆内存,这表达
char s[] = "abc";
在栈上分配内存,但我完全不能确定第一个表达式做什么。
通常,字符串文字存储在可执行文件的只读部分。指针s
将在堆栈上创建(或放置在一个寄存器中,或者只是优化掉) - 并指向那个位于“别处”的字符串字面值。
"abc"
字符串字面存储在__TEXT,__cstring
(或rodata
或任何依赖于对象格式)如果启用字符串池程序的部分。这意味着,它既不在堆栈中,也不在堆中,而是粘在代码附近的只读内存区域中。
char *s = "abc";
本声明将分配字符串文字到s
的存储位置,即s
点到只读存储器区域。
“堆栈”和“堆”是实现细节并取决于平台(全世界都是而不是 x86)。从语言POV来看,重要的是存储类别和范围。
字符串文字有静态程度;在程序启动时分配它们的存储空间,直到程序终止。它也假定字符串文字不能被修改(试图这样做调用未定义的行为)。将其与本地的块范围(自动)变量进行对比,这些变量的存储在块输入时分配并在块出口处释放。通常,这意味着字符串文字不会存储在与块范围变量相同的内存中。
注意,即使s是char *而不是char const,也不能修改字符串“abc”。 – AProgrammer 2010-02-15 15:21:31
实际上,使用char *来引用只读常量被认为已被弃用。还有一个编译器警告它。新软件应该使用const char * – Thorsten79 2010-02-15 15:53:03
除了“只读部分可执行文件”之外,还有其他可执行文件吗?也许“只读存储器”不那么令人困惑。 – alexkr 2010-02-15 16:04:01