栈的概念
栈(Stack)是一种特殊的线性数据结构,其特点是后进先出(Last In First Out,LIFO)
栈是用于存储局部变量,返回地址,函数参数等数据的内存区域
栈根据 存储方式分为顺序栈(使用连续的地址空间存储所有栈元素,通常采用数组实现。其优点是操作简单、访问速度快)和链栈(采用链式方式存储,通常采用单向链表实现。其优点是栈的大小可以动态调整,不存在满栈的情况,内存利用高效,但缺点是操作相对复杂)
1.分配和管理方式:由编译器自动管理(分配与释放)。分为静态分配(静态分配是由编译器在编译时自动完成的,主要用于分配局部变量和函数参数等的内存空间)和动态分配(动态分配是由程序员在程序运行时通过调用特定的函数(如malloc、calloc、realloc)等来手动申请的内存空间)
2.申请的内存大小:连续的内存区域(顺序栈),栈顶的地址和栈的最大容量是系统预先规定好的
3.申请效率:系统分配,速度快
4.内存地址增长的方向:由内存高地址向低地址方向
栈溢出
栈溢出是指程序试图访问超出栈空间的内存区域。栈溢出通常是由于程序未能正确管理栈空间,导致栈空间不足。
一.栈溢出的产生原因
1.递归调用:当函数调用自身时,如果递归层次过深,可能会导致栈空间不足。
2.数组:当函数中使用了一个很大的数组,且数组大小超过栈空间时,可能会导致栈溢出。
3.栈空间分配不足:程序在编译时未正确指定栈空间的大小。
二.栈溢出(系统)的处理
1.停止程序的执行:以防止程序访问非法区域。
2.记录错误信息:错误信息,包括错误类型,错误发生的位置等。
3.通知用户或开发者
三.防范栈溢出措施
1.优化代码:减少不必要的递归调用,避免创建过多的局部变量。使用动态内存分配(如malloc等)而不是静态数组。(使用完后要释放内存(free()))
2.安全检查:在编译和运行时进行安全检查,及时发现并处理栈溢出错误。
3.安全编程:遵循安全的编程实践,如避免使用易受攻击的库函数,正确处理输入数据等。