数据结构-堆和栈

对于一个进程的内存空间而言,可以在逻辑上分成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)

其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
指着栈底

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值