1 什么是栈
1.1 数据结构
FILO:先进后出
栈指针SP
1.2 栈的操作
入栈:push
出栈:pop
1.3 栈的类型
满递减FD( arm )
满递增
空递增
空递减
满指SP指向的栈顶保存了数据
2 栈的作用
栈是C语言运行的基础
函数参数
局部变量
函数返回值
编译器生成的临时变量
3 栈的初始化
3.1 栈初始化
DDR/SDRAM/SRAM初始化
初始化栈指针
3.2 不同处理器的栈指针
ARM:SP寄存器(R13)、FP(R11)
X86:ESP(栈顶指针)、EBP(栈底指针)
4 栈的起始地址
Linux用户栈 位于用户空间的高地址,靠近内核空间,二者之间有一个随机偏移(每次程序运行时,产生一个随机偏移,防止黑客攻击栈区)
5 栈的大小
5.1 Linux的进程栈大小
查看堆栈大小:$ ulimit -s
设置堆栈大小:$ ulimit –s size
调高堆栈容量会增加内存开销和启动时间
5.2 栈溢出
在最大值内,栈会动态增长
超过最大值,就会发生栈溢出(stack overflow),产生段错误
栈溢出实例
#include<stdio.h>
int main()
{
char a[8*1024*1024];
printf("hello world!\n");
return 0;
}