【问题标题】:Creation of char array causes memory in static?char数组的创建会导致静态内存?
【发布时间】:2012-12-01 21:48:46
【问题描述】:

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

char str[] = "White";

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

【问题讨论】:

标签: c++ memory-management static stack


【解决方案1】:

错了。你描述的就是你写的时候发生的事情:

const char * str = "White";

相反,

char str[] = "White";

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

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

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

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

【讨论】:

    【解决方案2】:

    没有。

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

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

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

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

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

    【讨论】:

    • 我想我从来没有见过这个问题回答得如此清晰准确......而且我见过这个问题被问很多
    • 其实那不是数组拷贝,而是char数组的初始化语法。
    • @MatteoItalia:关键是您正在从存储字符串文字的“数组”的任何地方复制,作为初始化的一部分。文字 确实 有数组类型,所以 Mooing 的回答是准确的。
    • 由于 OP 没有提到该行出现的上下文,因此还有另一种可能性。如果str 是在全局范围内或在文件范围内声明的,则根本不会在堆栈上创建任何内容(至少从任何用户函数的角度来看)。
    猜你喜欢
    • 2011-02-15
    • 1970-01-01
    • 2014-07-04
    • 2013-11-15
    • 2013-07-26
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多