1

对于以下代码,我想知道堆栈中是否只创建了一个数组,或者是否在静态中也创建了一个数组。我只是对从字符串创建数组感到困惑。

char str[] = "White";

我假设这会在堆栈中创建一个名为 str 的指针,该指针指向"White\0"静态内存中具有以下内容的数组。这是正确的假设吗?

4

2 回答 2

8

没有。

"White"是某个静态内存中的数组char[6]。(或魔法之地,没有具体说明,完全不相关)。"White"请注意,它可能与代码中其他地方的另一个静态数组相同,也可能不同。

char str[] = "White";char[6]在堆栈上创建一个名为 的新本地数组str,并将字符从静态数组复制到本地数组。不涉及任何指针。

请注意,这几乎是唯一可以复制数组的情况。在大多数情况下,数组不会像这样复制。

如果你想要一个指向魔法静态数组的指针,只需使用const char* str = "White";

Phonetagger指出,如果代码行不在函数中,str则不在堆栈上,但也在神奇的静态内存中,但复制仍然(至少理论上)发生在该翻译单元中的代码开始执行之前。

于 2012-12-13T22:18:20.723 回答
4

错误的。你所描述的是当你写时会发生什么:

const char * str = "White";

反而,

char str[] = "White";

在堆栈上创建一个数组(大到足以容纳该字符串),并使用该文本对其进行初始化。“常规”字符串文字和char数组的初始化语法是不相关的东西。

(至于实现,通常编译器发出的代码看起来像

char str[SIZE_OF_THE_STRING];
strcpy(str, "White");

但这是特定于实现的细节)

于 2012-12-13T22:16:31.043 回答