SKY外语计算机学习

标题: c语言中 栈是怎么一会事,有着什么样的语法,怎么使用,能举例一下吗? [打印本页]

作者: 格式化    时间: 2013-6-13 21:50
标题: c语言中 栈是怎么一会事,有着什么样的语法,怎么使用,能举例一下吗?
本帖最后由 sky_yx 于 2015-12-30 14:18 编辑

一直不是很理解栈是什么意思,求高手指导一下!


作者: Johnny.L    时间: 2013-6-14 09:31
本帖最后由 sky_yx 于 2015-12-30 14:18 编辑

我是2群的大叔.
你可以这么理解,栈有PUSH和POP动作,在后一次进入CALL之后,由系统自动分配.
运行过程中,自动管理.
并在每一个CALL RTN之后,自动POP.
堆呢,是一片连续的内存空间,交给用户自己分配,管理,释放....
在C里没有对应的,纯C而言,你记住,但凡malloc的,都要对应一个free...


作者: 10进制    时间: 2013-6-14 09:32
本帖最后由 sky_yx 于 2015-12-30 14:18 编辑

栈和堆都是进程资源,是一块内存空间,栈由高地址向低地址增长,堆由低地址向高地址增长。栈主要是用来存放一部分局部变量,函数返回的地址。


作者: Silence    时间: 2013-6-16 20:40
本帖最后由 sky_yx 于 2015-12-30 14:18 编辑

栈可以看做是一种顺序相关的数据类型,一般是用在内存中存储数据用的。栈主要有两个操作入栈(push)和出栈(pop)。入栈即把数据保存到栈中,出栈即读取栈中的数据。栈的push,pop操作只能操作栈顶的一个数据元素,而不能随意操作栈中的任意元素,有一定顺序要求。栈就像一个箱子一样,可以存放用户数据,第一个放进去的东西放在箱底,第二个在第二层,最后放进去的在最上面。取东西的时候刚好相反,先取走的肯定是箱顶的东西,最后才是箱底的,也就是所谓的先进后出。
对于细节性的东西可以参考数据结构的知识,堆栈实际可以看做一个对队列、栈等都有很明确的解释。如果用链表来实现堆栈,栈只需要有一个栈底指针和栈顶指针就可以。栈底指针指向堆栈开始的内存位置,如果两个指针指向同一个内存位置就认为栈是空的。没入栈一个数据,栈顶指针就指向新入栈的数据的内存地址。
如果通过线性表结构实现,堆栈就可以通过一个指针和容量大小两个参数来表达。指针指向栈所占用内存开始的位置,每入栈一个数据,栈的容量递增。出栈时容量递减,读取的数据为栈底即指针的位置至栈容量大小的偏移位置的数据。举个例子,你的程序中有函数1和函数2,函数1会调用函数2,函数2运行完毕后会继续运行函数1,现在正运行在函数1中准备调用函数2。
在调用函数2时,操作系统会自动把函数1的运行参数保存到堆栈中,即入栈,以便一会函数2执行完毕后继续执行函数1。入栈的数据可能有函数1的当前代码内存位置,相关参数、变量名称和值等,这个没仔细了解过。
当函数2执行完毕后主程序会接着原来执行的位置继续执行函数1,怎么知道原来执行到哪里呢?通过读取堆栈中保存的运行信息就可以了,这通过出栈操作就可以实现。






欢迎光临 SKY外语计算机学习 (http://skywj.com/) Powered by Discuz! X2.5