您的位置:首页 > 其它

一直没搞清楚的堆与栈的总结

2016-09-13 22:06 232 查看
从数据结构上说

栈,是在内存中从高地址向低地址生长,并且是一块连续内存的区域。也就是说,在系统中,栈的栈顶地址,以及栈的大小,是事先就在编译器里设定好了的,这也就是为什么函数存在栈溢出的问题。

堆,是从低地址开始生长,并且是在内存中不连续的内存区域。操作系统采用链表形式来存储空闲内存地址的,也就是说,我们malloc或者callloc出来的内存,就是堆。可见,堆更加灵活。

从存储内容上说

主调函数调用新函数时,首先进栈的是主调函数的下一条指令的地址,然后是函数的各个参数,大多数编译器参数是从右往左入栈,接着是函数的局部变量,注意,静态变量不入栈。

堆存储的内容完全是由申请内存的程序员自行制定。

总结

总结: 栈是操作系统使用的一种功能,它有大小限制,操作不灵活。而堆是编程语言提供的一种功能,非常灵活,但是效率不如栈。最后,栈是操作系统自动释放的,而堆用完后最好主动调用free()来释放,虽然程序结束它也会自动释放。

为什么递归容易导致栈溢出?

根据以上的解释,当进行递归时,每一层递归的函数以及相应的局部变量都会被压入栈中,所以,递归过程就是一个只进不出栈的过程,自然存在栈溢出的可能性。改进方式就是使用循环语句来改进递归,或者自己申请栈空间、堆空间等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  操作系统