内存中变量:全局变量、局部变量、静态变量(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),接着跳转到函数地址接着执行
如下图所示: