部分转自https://blog.csdn.net/foreverhuylee/article/details/38978415
堆栈和栈就是一个概念!!!
队列是先进先出:就像一条路,有一个入口和一个出口,先进去的就可以先出去。
而栈就像一个箱子,后放的在上边,所以后进先出。
(堆和它们不同,不存在是先进后出还是先进先出)
堆栈空间分配
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
从变量存储方面来看堆和栈的区别:
程序的局部变量存在于(栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中;
这样说比较准确,所谓的栈其实是由寄存器ebp和esp指向的一片内存空间(ebp指向栈底,esp指向栈顶),原则上是由高地址向低地址生长的一片空间,会保存一些临时的数据,比如一个函数中的临时变量以及返回地址,数据的出入是先进后出,后进先出。
全局变量实际上是存在一个(一般来说正常的编译器)可读可写的内存空间,这个空间是在你写程序编译好的空间地址(由编译器决定),是固定的。
堆是由操作系统管理的一片空间,事先是没有在进程空间里分配的(比如你在没有分配堆的时候就访问堆空间会报一个内存访问错误),一般是由程序动态的分配出来,一旦分配了以后,一般需要程序去释放自己的堆空间。
堆,用于保存new 和malloc这些自定义的内存变量。
全局静态区用于保存全局变量和静态变量。
字符常量区,用于保存字符串。
代码区,用于保存程序的二进制代码。
队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。
栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{ 堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,只要你喜欢。