栈
由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯一的。栈是向低地址扩展的数据结构,是连续的内存区域,采用后进先出(LIFO )。
优缺点:
快速高效
缺点
有限制,数据不灵活[LIFO]
iOS主线程栈大小是1MB
其他线程是512KB
MAC是8M
堆
由程序员分配和释放,若程序员不释放,程序结束时可能由系统回收。堆是向高地址扩展的数据结构,是不连续的内存区域,以链表的方式进行存储。
优点
灵活方便,数据适应面广泛
缺点
效率有一定降低
全局区(静态区)
全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量放在一块区域,未初始化的静态变量和未初始化的动态变量是在相邻的区域的,程序结束后系统释放。
常量区(数据段)
存放常量字符串程序结束后由系统释放
代码区
存放函数的二进制代码
补充
栈帧
C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。
栈溢出
栈顶的地址和栈的最大容量是系统预先规定的,只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常来提示栈发生溢出。
堆溢出
堆溢出是指程序向某个堆块中写入的字节数超过了堆块本身可使用的字节数(之所以是可使用而不是用户申请的字节数,是因为堆管理器会对用户所申请的字节数进行调整,这也导致可利用的字节数都不小于用户申请的字节数),因而导致了数据溢出,并覆盖到物理相邻的高地址的下一个堆块。
网友评论