对于以下代码,我想知道是否只在堆栈中创建了一个数组,或者是否还有一个在静态中创建的数组。我只是对字符串中的数组创建感到困惑。
char str[] = "White";
我假设这在堆栈中创建了一个名为str的指针,该指针指向静态内存中具有以下内容"White\0"
的数组。这是正确的假设吗?
答案 0 :(得分:8)
不。
"White"
是静态内存中某个char[6]
的数组。 (或魔法之地,未指明,并且完全无关紧要)。请注意,它可能与代码中其他"White"
的静态数组相同,也可能不同。
char str[] = "White";
在堆栈上创建一个新的本地char[6]
数组,名为str
,将字符从静态数组复制到本地数组。没有涉及任何指针。
请注意,这只是可以复制数组的唯一情况。在大多数情况下,数组不会像这样复制。
如果你想要一个魔术静态数组的指针,只需使用const char* str = "White";
Phonetagger注意到如果代码行不在函数中,那么str
不在堆栈中,而且在魔术静态内存中,但副本仍然存在(理论上至少)恰好在该翻译单元的代码执行开始之前发生。
答案 1 :(得分:4)
错误。你所描述的是你写的时候会发生什么:
const char * str = "White";
相反,
char str[] = "White";
在堆栈上创建一个数组 (足够大以容纳该字符串),并使用该文本初始化它。 “常规”字符串文字和char
数组的初始化语法是不相关的东西。
(至于实现,编译器通常会发出看起来像
的代码char str[SIZE_OF_THE_STRING];
strcpy(str, "White");
但这是一个特定于实现的细节)