虚拟内存分段
虚拟内存分段分为:
1.栈 2.堆 3.静态区(数据段) 4.常量区(代码段/正文)
一. 栈
函数的调用需要建立栈帧,栈帧主要存储函数的变量,参数,返回值等等。
栈是向下生长的,栈帧后调用的比先调用的地址小,栈的大小一般是有规定的,栈所占的内存是不大的。
二.堆
动态内存申请和释放例如malloc和free在堆中分配空间与释放空间,堆是比较大的,一般有接近2g左右的空间,堆是向上生长的,堆是给指针申请内存的,也就是说后申请的地址比先申请的地址大
三.静态区
static修饰的变量和全局常量在静态区
四.常量区
常量和程序编译出的指令在常量区存储,注意:const变量不是定义在常量区的。
例子:
在上图中可以看到很多变量的声明与定义
而在这些变量中有:
int globalVar = 1; 因为这时是定义在全局变量,所以此时此变量就存储在静态区。
static int staticGlobalVar = 1; 此时变脸是定义在全局的并且还是一个静态变量,所以此时该变量也是存储在静态区的。
int localVar = 1; 此变量是定义在主函数中的,所以此变量是存储在栈中的。
char char2[] = “abcd”; 此时定义的是一个数组,所以当前的char2变量是存储在栈中的。
char* char3 = “abcd”; 此时定义的是一个指针