C/C++内存分为五个部分:
一、栈区(stack):存放函数的参数值,局部变量的值等(编译器自动分配释放 )。
二、堆区(heap): 注意:与数据结构中的堆彻底不一样,分配方式相似于链表(程序员分配释放,若程序员不释放,程序结束时可能由OS回收 )。
三、全局区(静态区):全局变量和静态变量存储在一块,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另外一块区域(程序结束后由系统释放)。
四、文字常量区:常量字符串就是存储在这里(程序结束后由系统释放)。
五、程序代码区:存放函数体的二进制代码。 程序员
在unix环境高级编程一书中,对于栈和堆是这样定义的:编程
栈:自动变量以及每次函数调用是所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息(例如某些机器寄存器的值)都存放在栈中。而后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。经过以这种方式使用栈,能够递归调用c函数。递归函数每次调用自身时,就使用一个新的栈帧,所以一个函数调用实例中的变量集不会影响另外一个函数调用实例中的变量。数据结构
堆:一般在堆中进行动态存储分配,因为历史上造成的惯例,堆位于非初始化数据段和栈之间。函数
栈和队列头文件:spa
#include <stack>unix
#include<queue>递归
栈:队列
stack<int> curStack; //栈定义内存
操做:字符串
curStack.empty() 若是栈为空返回true,不然返回false;
curStack.size() 返回栈内元素的大小;
curStack.pop() 从栈顶弹出一个成员;
curStack.push() 向栈内压入一个成员;
curStack.top() 返回栈顶,但不删除成员;
队列:
queue<int> curQueue; //队列定义
操做:
curQueue.empty() 若是队列为空返回true,不然返回false;
curQueue.size() 返回队列内元素的大小;
curQueue.pop() 从队列弹出一个成员;
curQueue.push() 向队列压入一个成员;
curQueue.front() 返回到队首,但不删除成员;
curQueue.back() 返回到队尾,但不删除成员;
堆、栈、队列之间的区别是?
①堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对通常内存的访问没有区别。
②栈就是一个桶,后放进去的先拿出来,它下面原本有的东西要等它出来以后才能出来。(后进先出)
③队列只能在队头作删除操做,在队尾作插入操做.而栈只能在栈顶作插入和删除操做。(先进先出)