栈是计算机科学中常用的抽象数据类型。栈中的对象有一个特点:放入栈中的最后一个对象总是先取出,通常称为后进先出队列。堆栈中定义了一些操作。最重要的两个是PUSH和POP。PUSH操作将一个元素添加到堆栈顶部。相反,POP操作从堆栈顶部移除一个元素,并将堆栈的大小减少一。
栈溢出是由于函数调用过多导致的,使得调用栈无法容纳这些调用的返回地址,通常发生在递归中。堆栈溢出可能是由无限递归引起的,但可能只是堆栈层次太多。
溢出的一般原因如下:
1.函数调用级别太深。递归调用一个函数时,系统要把函数调用过程中产生的场景和变量保存在栈中。如果递归调用太深,堆栈会溢出,然后递归无法返回。此外,当函数调用的级别太深时,可能会导致堆栈无法容纳这些调用的返回地址,从而导致堆栈溢出。
2.动态应用空使用后未发布。因为C语言没有自动垃圾回收机制,所以程序需要主动释放不再使用的动态地址空。应用动态空使用堆空,不会造成堆溢出。
3.数组访问越界。c语言不提供数组下标越界检查。如果程序中数组下标访问超出数组范围,运行过程中可能会出现内存访问错误。
4.指针非法访问。指针持有非法地址,通过这样的指针访问指向的地址会出现内存访问错误。
堆溢出:不断地更新一个对象,总是创建新的对象,
堆栈溢出:无休止的循环或递归太深,递归原因可能太大或没有终止。
一般来说,“栈溢出”是指“调用栈溢出”。用通俗的方式解释调用堆栈可能很困难,因为它涉及到许多其他计算机体系结构的知识。这个答案简单解释了数据结构栈的特点——先进先出/后进先出。溢出意味着数据结构已满,无法存储更多数据。其他数据结构也会出现这种情况。即使数据结构不是固定容量,而是可扩展的,仍然有可能溢出有限的内存空。
另外,很多时候,“调用栈溢出”和递归有关。我们可以将一些递归实现改变为迭代,但是有时我们必须有一个定制的堆栈数据结构,比如树的深度优先搜索。自定义堆栈可能会溢出。
所以堆栈溢出虽然经常指调用堆栈溢出,但本质上只是数据结构的一种溢出情况。
1.《堆栈溢出 【干货】堆栈溢出一般是什么原因?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《堆栈溢出 【干货】堆栈溢出一般是什么原因?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/1776704.html