变量的内存分配情况

内存中变量:全局变量、局部变量、静态变量(static)和寄存器变量(register)

 

    局部变量和全局变量分配的内存地址差十万八千里,而全局变量和静态变量分配的内存是连续的。这是因为局部变量和全局变量/静态变量是分配在不同类型的内存区域中的结果。

  一个进程的内存空间可分为三个段:

数据段:存放的是全局变量、常量以及动态内存分配的数据空间(malloc)

代码段:存放的程序代码的数据                   

堆栈段:存放的是子程序的返回地址、参数以及局部变量

       栈是一种线性结构,堆是一种链式结构,堆和栈在动态数据区 

   一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态区,局部变量分配在动态数据区,即堆栈中。如下所示:

                                                                              

#include<stdio.h>

void func(int a,int b,int c)
{
   int var1 = a;
   int var2 = b;
   int var3 = c;

   printf("%p\n",&a);
   printf("%p\n",&b);
   printf("%p\n",&c);
   printf("**********\n");
   printf("%p\n",&var1);
   printf("%p\n",&var2);
   printf("%p\n",&var3);
}

int main(void)
{
   func(1,2,3);
   return 0;
}
运行结果:
0xbfc3d4b0
0xbfc3d4b4
0xbfc3d4b8
**********
0xbfc3d4a4
0xbfc3d4a0
0xbfc3d49c

函数调用堆栈情况:

   首先,函数的3个形参以从右到左的次序压入栈,先压c,再压b,最后压a 。然后压入函数的返回地址(RET),接着跳转到函数地址接着执行

如下图所示

                                                                

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值