char数组的创建导致内存静态?

时间:2012-12-13 22:13:41

标签: c++ memory-management static stack

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

char str[] = "White";

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

2 个答案:

答案 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");

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