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