对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区
动态数据去一般是 “堆栈” 栈是线性结果 堆是链性结构
全局变量和静态变量分配在静态数据区
堆栈都是先进后出
堆
堆 (head) 是为动态分配预留的空间 ,alloc和new申请的空间
特点
程序员自己主动申请的 例如new和melloc 需要程序员自己释放 不释放则一直存在
堆一般能申请的空间较大
例子
int x = 0;//全局初始化区
int main() {
int y;//栈区
char a[] = "123";//栈区
char *a1;//栈区
char *a2 = "345";//"345"在常量区
static int c = 0;//全局静态初始化区
char *p3 = new char(65);//堆区
栈
栈 (stack) 是为执行线程流出的内存空间 一般存放局部变量 函数参数值
栈顶地址总是小于等于栈的基地址 也就是先压进栈的地址偏大
例子
void __stdcall func(int param1,int param2,int param3)
{
int var1=param1;
int var2=param2;
int var3=param3;
printf("0x%08x\n",param1); //打印出各个变量的内存地址
printf("0x%08x\n",param2);
printf("0x%08x\n\n",param3);
printf("0x%08x\n",&var1);
printf("0x%08x\n",&var2);
printf("0x%08x\n\n",&var3);
return;
}
结果
0x0012ff78
0x0012ff7c
0x0012ff80
0x0012ff68
0x0012ff6c
0x0012ff70
图中param3是先被压进栈的 也就是参数列表是从右向左压入栈中
特点
系统自动分配和释放 因为主要是局部变量 所以在生命周期结束就会被系统自动释放
栈一般一次申请的大小是2MB
静态数据区
分配静态变量, 全局变量的空间
只读区
分配常量和程序代码
全局变量(应该是局部变量)(Global)
本地变量(Local)
静态变量(Static)
寄存器变量
语法
ESP:栈指针寄存器(extended stack pointer)
其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
就是指着栈顶
EBP 基址指针寄存器(extended base pointer)
其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
指着栈底