这是一个基于问题答案的问题:
const char myVar* vs. const char myVar[]
const char* x = "Hello World!";
const char x[] = "Hello World!";我现在明白了其中的区别,但我的新问题是:
(1)如果我重新赋值x,第一行中的"Hello World“字符串会发生什么?到那时没有任何东西指向它-当作用域结束时它会被销毁吗?
(2)除了常量之外,编译器在内存中存储的两个示例中的值有何不同?
发布于 2011-08-17 02:08:11
在代码中放置"Hello World!"会导致编译器在编译的可执行文件中包含该字符串。当程序执行时,这个字符串是在调用main之前在内存中创建的,我相信,甚至在对__start的汇编调用之前(也就是静态初始化器开始运行的时候)。char * x的内容不是使用new或malloc分配的,也不是在main的堆栈框架中分配的,因此不能取消分配。
但是,在函数或方法中声明的char x[20] = "Hello World"是在堆栈上分配的,虽然在作用域中,该"Hello World"实际上在内存中有两个副本-一个预先加载了可执行文件,另一个在堆栈分配的缓冲区中。
发布于 2011-08-17 02:11:07
编译器将第一个数据存储在称为RODATA (只读数据)的内存部分中。只要程序仍在运行,内存就仍然保持其初始值。
第二个数组就像其他数组一样存储在堆栈上。就像任何其他局部变量一样,一旦它的作用域结束,它就可以被覆盖。
发布于 2011-08-17 02:06:42
"Hello World!"字符串都是作为char的连续序列在静态内存中分配的,因此既没有要回收的动态分配内存,也没有要销毁的类实例;x都将被分配到静态内存或堆栈中,具体取决于它们的定义位置。然而,指针将被初始化为指向相应的"Hello World!"字符串,而数组将通过直接将字符串文字复制到其中来初始化。理论上,当没有办法访问这两个字符串时,编译器可以自由地回收它们的内存;实际上,第一个不太可能被回收,因为通常静态内存一直分配给程序,直到它终止;另一方面,如果数组被分配在堆栈上,第二个甚至可能根本不被分配,因为编译器可以使用其他方法来确保数组被正确初始化,当数组超出范围时,数组内存将被回收。
https://stackoverflow.com/questions/7082786
复制相似问题