Char Array VS Char *

时间:2011-08-16 18:01:33

标签: c++

这是一个基于问题答案的问题:

const char myVar* vs. const char myVar[]

const char* x = "Hello World!";
const char  x[] = "Hello World!";

我现在了解不同之处,但我的新问题是:

(1)如果我重新分配x,第一行中的“Hello World”字符串会发生什么?在那一点上没有任何东西会指向它 - 当范围结束时它会被破坏吗?

(2)除了常量之外,编译器中两个示例中的值如何不同地存储在内存中?

3 个答案:

答案 0 :(得分:9)

在代码中放置"Hello World!"会导致编译器将该字符串包含在已编译的可执行文件中。执行程序时,在调用main之前在内存中创建字符串,我相信,甚至在汇编调用__start之前(这是静态初始化程序开始运行时)。 char * x的内容未使用newmalloc分配,也未在main的堆栈框架中分配,因此无法取消分配。

但是,在函数或方法中声明的char x[20] = "Hello World"是在堆栈上分配的,而在范围内,实际上在内存中会有两个"Hello World"的副本 - 一个预装了可执行文件,堆栈分配缓冲区中的一个。

答案 1 :(得分:4)

编译器将第一个存储在名为RODATA(只读数据)的内存部分中。只要程序仍在运行,内存仍保持其初始值。

第二个存储就像任何其他数组一样 - 在堆栈上。就像任何其他局部变量一样,一旦它的范围结束就可以覆盖它。

答案 2 :(得分:-1)

  1. 在两种情况下,"Hello World!"字符串在正常情况下被分配为char的连续序列,因此没有动态分配的内存来回收,也没有任何类实例要销毁;
  2. 两个x将分配在静态内存或堆栈中,具体取决于它们的定义位置。但是,指针将被初始化以指向相应的"Hello World!"字符串,而数组将通过将字符串文字直接复制到其中来初始化。
  3. 理论上,当没有方法可以访问它们时,编译器可以自由地回收两个字符串文字的内存。在实践中,第一个不太可能被回收,因为通常静态存储器仍然分配给程序直到它终止;另一方面,如果数组在堆栈上分配,第二个甚至可能根本就没有分配,因为编译器可能会使用其他方法来确保数组被正确初始化,并且数组内存将在它退出时被回收范围。