注意,这里说的堆栈,和数据结构中的堆栈,不是一回事。这里的堆栈是存放程序部分数据的区域,不是在程序中由程序猿定义的数据结构。
1.堆区:程序猿分配和释放,如果程序猿不释放,程序结束时,os自动回收。操作方式,类似于数据结构中的链表。
2.栈区:编辑器自动分配和释放。操作方式,类似于数据结构中的栈。
3.全局区(也叫静态区):声明全局变量时分配,程序结束自动释放。
4.文字常量区:声明常量时分配,程序结束自动释放。
5.程序代码区
1.堆区:函数参数值、局部变量值
2.栈区:部分变量本身,而不是它们的值。//注意是部分,不是全部,这一点参考的他人博客
3.全局区:全局变量和静态变量。
其中初始化的全局变量和静态变量,放在一个区域。未初始化的全局变量和静态变量放在相邻的一个区域。
4.文字常量区:常量字符串
5.程序代码区:函数体的二进制代码
#include//引入c 的标准输入输出头文件
#include//malloc()的头文件
#include//strcpy()的头文件
using namespace std;//使用标准命名空间
/*全局变量*/
int a=0;//全局,初始化区
char *p1;//全局,未初始化区
/*主函数*/
int main()
{
int b;//栈,变量本身
char arr[]="abc";//栈,
char *p2;//栈,变量本身
char *p3="123456";/*p3变量本身,栈
123456\0,文字常量区*/
static int c=0;//全局,初始化区。静态变量。
p1=(char*)malloc(10);/*堆,malloc()从堆区分空间
这也符合堆区要程序猿申请和释放的特点
申请的空间为10字节*/
strcpy(p1,"123456");/*让p1指向常量区,因为123456\0在常量区
p1本身在全局区*/
}
5.1.堆的申请方式
程序猿手动申请
c语言,用malloc()
char *p1;
p=(char*)malloc(10);/*申请10个字节空间
在windows中一个char占1个字节,即8位*/
c 语言,用new
int *p2=new int(10);/*申请10个int类型的空间
在windows中一个int占4个字节,即32位*/
注意,p1和p2本身在栈中
5.2.栈的申请方式
系统或者说编辑器自动申请
int a;
自动在栈为变量a分配空间
6.1.堆
操作系统有一个记录空闲内存地址的链表,
当系统收到程序猿的申请时,
遍历列表,
找到第一个空间大于“申请空间”的节点,
将这个节点从空闲链表里删除,
将该节点分配给程序,
在这块内存空间首地址处记录分配的大小,
如此,之后的delete()才能正确释放内存空间。
注意,这个节点的空间只要大于“申请空间”就行,不是等于申请空间。
多余的部分,系统自动放回空闲链表。
6.2.栈
只要栈的“剩余空间”大于“申请空间”,系统就能自动分配内存给相应的程序。
当“剩余空间”不够时,报错,提示栈溢出。
系统自动分配效率高,程序猿申请效率低。