怎样理解操作系统中“栈”的概念?

俺原来的意思是说,在c的函数中,函数的变量的内存都在栈上对把(除了用new 和malloc申请的外),当这个函数的调用结束的时候,这些变量就会销毁对把,
问题:
1、那为什么这些变量的内存是在栈中分配的而不是在堆中分配的呢?

2、这个栈也符合后进先出的原则吗?
比如:我定义变量 char a,b;那么,在程序运行时,如果想取得a的值是不是先要把b取出来?

望高手给予解答、谢谢、

1、这没有为什么,C语言它就规定局部动态变量用完就销毁,所以在系统中专门划一块区域放这类变量。
2、这个栈不需要后进先出,它只满足“栈”的“只能在一端(称为栈顶(top))对数据项进行插入和删除”这个性质,你可以在不把其他元素出栈的前提下就直接访问栈底元素。追问

谢谢你啦、、你的简洁些、、

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-21
1. 因为方便,毕竟在栈中弄一块数据只要给esp加点数字就行了,局部变量不值钱。堆就麻烦多了。

2. 对。这是数据栈的一个内建实现。但是你对局部变量的理解有误区,
局部变量访问靠的是ebp寄存器,如果你反汇编就会看到进入一个函数首先会:
push ebp // 保存ebp
mov ebp,esp // 将ebp用来指向函数栈区开头
sub esp,xxh // 初始化局部变量

函数栈区是我自己的叫法,不过要记得若是栈访问超出了这个区域那程序肯定错了。

然后访问a和b用的是[ebp-n]比如,[ebp-4]可能就指向你的a。
明白了吧,esp和ebp都是寄存器,esp是32位栈寄存器,会跟着push和pop操作变化值,也就是通常的数据栈实现中的那个顶部指针。ebp是基址寄存器,常年打酱油所以经常被这么用。

上面那家伙是怎么混到15级的 =.=追问

貌似你们是一个意思嘛、、呵呵、

相似回答