这里介绍的内存位置是程序对应的虚拟内存, 然后通过编译原理(0)我们知道,操作系统会把虚拟内存地址映射到物理内存地址。
局部变量,函数形参----存于(stack);
new出来的变量--------存于堆区(heap);
全局变量,静态变量----存于数据区;
函数代码----------------存于代码区;
Tips:
1、经过编译和链接阶段后,函数变成了二进制字节码,存放在低地址的代码区,可以认为这个时候的函数的虚拟内存地址是固定的了。
2、经过编译和链接阶段后,全局变量和静态变量的地址也是固定的
3、new出来的对象放在Heap区,从起始的低地址---->高地址一个个的排,理论上,只要有内存,可以一直生成。
4、局部变量、形参在Stack区,从起始的高地址 -----> 低地址一个个排,Stack空间固定,如果数据过大就会栈溢出,造成程序崩溃。
高地址
┌───────────────────────────────┐
│ Kernel Space │ (内核空间,用户程序不可访问)
├───────────────────────────────┤
│ │
│ Stack (栈) │ ↓ 由高地址向低地址增长
│ │
├───────────────────────────────┤
│ ↓ │
│ │
│ ↑ │
│ │
│ Heap (堆) │ ↑ 由低地址向高地址增长
├───────────────────────────────┤
│ │
│ Memory Mapping Segment │ (动态库、文件映射等)
│ (mmap) │
├───────────────────────────────┤
│ │
│ BSS (未初始化数据) │ .bss(初始化为0)
│ │
├───────────────────────────────┤
│ │
│ Data (已初始化数据) │ .data(显式初始化)
│ │
├───────────────────────────────┤
│ │
│ Text (代码区) │ .text(只读,存放机器指令)
│ │
└───────────────────────────────┘
低地址