我对这个表达有点困惑:
char *s = "abc";
是否在堆栈上创建了字符串文字?
我知道这个表达
char *s = (char *)malloc(10 * sizeof(char));
在堆上分配内存和此表达式
char s[] = "abc";
在堆栈上分配内存,但我完全不确定第一个表达式的作用。
答案 0 :(得分:21)
通常,字符串文字"abc"
存储在可执行文件的只读部分中。指针s
将在堆栈上创建(或放置在寄存器中,或者只是优化掉) - 并指向生活在“其他地方”的字符串文字。
答案 1 :(得分:6)
"abc"
如果启用了字符串池,则字符串文字存储在程序的__TEXT,__cstring
(或rodata
或任何取决于对象格式的部分)部分。这意味着它既不在堆栈上,也不在堆中,而是粘在代码附近的只读内存区域。
char *s = "abc";
此语句将字符串文字"abc"
的内存位置分配给s
,即s
points 到只读内存区域。< / p>
答案 2 :(得分:3)
“Stacks”和“堆”是实现细节,取决于平台(世界上所有不 x86)。从语言POV来看,重要的是存储类和范围。
字符串文字具有静态范围;它们的存储在程序启动时分配并保持到程序终止。还假设不能修改字符串文字(尝试这样做会调用未定义的行为)。将此与本地块范围(自动)变量进行对比,这些变量的存储在块条目上分配并在块退出时释放。通常,这意味着字符串文字不会与块范围变量存储在同一内存中。