首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Char数组VS Char *

Char数组VS Char *
EN

Stack Overflow用户
提问于 2011-08-17 02:01:33
回答 3查看 1.8K关注 0票数 6

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

const char myVar* vs. const char myVar[]

代码语言:javascript
复制
const char* x = "Hello World!";
const char  x[] = "Hello World!";

我现在明白了其中的区别,但我的新问题是:

(1)如果我重新赋值x,第一行中的"Hello World“字符串会发生什么?到那时没有任何东西指向它-当作用域结束时它会被销毁吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-17 02:08:11

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

但是,在函数或方法中声明的char x[20] = "Hello World"是在堆栈上分配的,虽然在作用域中,该"Hello World"实际上在内存中有两个副本-一个预先加载了可执行文件,另一个在堆栈分配的缓冲区中。

票数 9
EN

Stack Overflow用户

发布于 2011-08-17 02:11:07

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-08-17 02:06:42

  1. 在这两种情况下,"Hello World!"字符串都是作为char的连续序列在静态内存中分配的,因此既没有要回收的动态分配内存,也没有要销毁的类实例;
  2. 这两个x都将被分配到静态内存或堆栈中,具体取决于它们的定义位置。然而,指针将被初始化为指向相应的"Hello World!"字符串,而数组将通过直接将字符串文字复制到其中来初始化。

理论上,当没有办法访问这两个字符串时,编译器可以自由地回收它们的内存;实际上,第一个不太可能被回收,因为通常静态内存一直分配给程序,直到它终止;另一方面,如果数组被分配在堆栈上,第二个甚至可能根本不被分配,因为编译器可以使用其他方法来确保数组被正确初始化,当数组超出范围时,数组内存将被回收。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7082786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档