虚拟地址分配总共分为5个部分
内核1G
栈空间(Stack)
堆空间(heap)
数据区(.data,.bss)
常量区(只读)
1)栈空间:用来存放局部变量,函数的形参变量,自动变量(auto修饰的);
特点:a)栈空间是os(操作系统)自动分配和回收,程序员不用刻意去管理
b)栈空间可以反复被使用;
c)栈空间是脏的!(因此定义局部变量时需要进行初始化,因为其保留了上一次的计算结果)
d)栈空间具有临时性—-即不能返回栈变量的指针;
int num=10;
return # ×
这段代码是错误的,即栈空间的变量不能返回指针(地址)
2)堆空间:通常由malloc,ralloc,calloc函数分配的空间存放在堆空间内
先进先出! 由用户自己管理!
特点:a)灵活:程序员需要用到时自己手动进行分配和释放;
b)内存量庞大;
c)通过free()手动申请释放的空间;(如果长时间不释放堆空间的内存,会导致内存泄露!!!)
内存泄露——-即空间一直被占用,不会讲这块空间分配给其他的程序。
d)具有临时性,堆空间只在malloc()与free()函数之间具有使用权;
e)堆空间也是脏的!使用之前需要清空下
3)
数据区:
.data段:数据段,保存全局变量,静态变量(static修饰的)
.bss段:未初始化的全局变量(会自动置0)
or段:only read,只读段,常量
静态数据区:static,初始化的全局变量
代码段:.text:保存代码。