栈到底是什么?????求解释
栈到底是什么东西??
我也学计算机组成原理了,也简单讲了栈,就是什么先进后出,压栈出栈什么的,这个我明白,但是这个怎么跟c语言的栈,
联系起来呢??
c语言如定义变量int i;是不是就是再栈区开辟空间?为什么是在栈区呢,而不是直接在内存中其他区域?
而且栈有先进后出的特点,这有什么用吗??
定义变量在栈开辟内存空间的话,先进后出是不是对变量调用会用影响??
栈带地有什么用处?为什么见老师还是别的程序员老师提起栈呢??
大虾们,救助一下无知的小弟吧!
[解决办法]
栈的特点,先进先出,后进后出,楼主已经了解。
C语言,定义局部变量的时候,都是放在内存中的栈区的,因为C语言是函数调用式的语言,当一个函数A内,调用另一个函数B的时候,如何保证B调用完毕,还能还原A在内存中的一些东西呢?答案就是,使用栈的特性。
简单来说,A调用B之前,会将局部变量,形参等数据放到栈里,然后再跳转到B的执行地址。B执行完后,再从栈弹出A的局部变量、形参等等。如果多层调用,更明显,A调用B,B调用C,那么A保存自己的“现场”后,调用B,B调用C前也保存自己的“现场”,C执行完后,从栈里,先弹出B,等B执行完,再弹出A。
栈的这一原理,楼主看看汇编相关书籍才能理解,推荐《深入理解计算机系统》
[解决办法]
2楼说的也不算错。栈的概念,本身是汇编层面或者说机器语言层面的。只是不管C,还是其他高级语言,最终会被翻译成汇编。
所以,从“底层”了解程序在计算机内部执行的过程时,会提到“栈”的概念。
[解决办法]
系统会为主进程分配一块栈空间,默认是1M,一般情况下,局部变量的空间在栈中分配
[解决办法]
栈区(stack)---由编译器自动分配和释放,申请速度快,但程序员无法控制。主要存放函数的参数值、局部变量等。栈顶地址小于栈的基地址。
堆区(heap) ----由程序员分配和释放,由new和malloc申请,delete和free释放,分配的内存区不一定是连续的,类似链表。若程序员不释放,程序结束是可能由OS回收。
全局数据区(static) ---存储全局变量和静态变量,即使是函数内部的静态变量也存储在此区域,程序结束后由系统释放。
常量区(constant) ---程序中所有常量都存放在这里,程序结束后由系统释放。
代码区(code) ---存放程序的二进制代码。
1、 通过对工程项目的设置,调整栈区的大小。
在VC++2008中可通过如下方式调整,通过project->property->linker->system中调整stack reserve size。
2、 通过动态分配二维数据
动态分配二维数据方法为:
int **a = new int*[row];
for(int i=0;i<row;i++)
a[i] = new int[col];
其释放方法为:
for(int i=0;i<row;i++)
{
delete [col]a[i];
a[i]=NULL;
}
delete [row]a;
a=NULL;
[解决办法]
所谓栈就是一块固定大小(设定后就不变的意思)的存储空间,其中的元素遵循后进先出(LIFO)的原则。
计算机组成原理中的栈和C语言中的栈,除了上面的内容是相同的外,并没有实质上的直接联系。
编程中讲到的栈,可以参考5楼的说法。需要补充一点的是,编程中的栈空间,地址是向下变化的,而堆空间是向上变化的。同时,如果用到了线程,那么每个线程将有各自的栈,但共享进程的堆。