指针对象的内存分配

时间:2011-09-16 10:34:48

标签: c++ c visual-c++

如何为指针对象分配内存

 char *str = "Check";
 char *str1 = new char[6];

这里我想知道str如何指向“Check”而不进行内存分配(使用new)。当我打印str时,我正在“检查”。有人可以帮助我两者的区别。

4 个答案:

答案 0 :(得分:4)

str指向由编译器分配的内存,通常是只读内存。

编译器会将Check\0发送到可执行文件的只读部分,然后安排str的分配使str指向该位置。

答案 1 :(得分:4)

首先,“指针”和“对象”是C / C ++中的不同术语。 “pointer”是一个保存“对象”(数据类型)地址的实体。

在给定的代码示例中,str指向一个内存区域,该区域在代码编译期间静态分配;在程序结束之前,"Check"也会一直存在。

此内存是固定大小,位于代码的只读区域。此外,在C ++中不推荐使用该表示法。它应该是,

const char *str = "Check";  // "Check" is not modifiable
^^^^^ 

答案 2 :(得分:0)

所谓的“自动”变量的内存不是从堆中分配的(其中new获取其内存)。在实践中,诸如这些的局部变量通常在堆栈上。在许多情况下,它们也可以直接在CPU寄存器中。

答案 3 :(得分:0)

这可能会触及niptiking,但是......许多回答都谈到“编译器分配的内存”:实际上并非如此:操作系统将内存提供给运行程序的进程,而不是编译器。

事实上,编译器将文字存储到可执行文件的一部分中,该文件的偏移量已为链接器所知,这使得这些偏移量成为“启动函数”。 当程序被“激活”时,操作系统将文件加载到内存中,将所有偏移添加到加载地址,从而将所有偏移转换为地址,创建“堆栈”而不是调用启动函数。 启动功能包装“堆”,调用所有全局& static对象的构造函数和调用main。此时"Check"只是从给定地址开始的一系列字节。该地址是str的地址。

因此,内存不是“由编译器分配”。它在程序启动阶段分配,并使用先前由编译器保存的数据进行初始化。