堆栈这两个词我们经常会遇到,面试官也特别喜欢问这个问题,堆栈是什么呢,今天我们来学习下单片机内存的相关知识。


堆(heap):

堆是用于存放程序运行过程中需要动态分配的内存段,它的大小并不是一定的,而是伸缩可变的,随着应用程序的需要而扩张或缩小。

当我们在代码里使用malloc等函数分配内存时,新分配的内存就被动态添加到堆上,这个时候堆会扩张。

当我们使用完毕,用free等函数释放内存时,被释放的内存从堆中被剔除(堆会缩减)。

单片机和微机堆栈操作的区别 深入理解单片机内存(1)

栈(stack):

单片机和微机堆栈操作的区别 深入理解单片机内存(2)

栈,又常称为堆栈,用来存放函数中定义的局部变量。

栈有一个特性,就是FIFO,就是先进先出的特点。这样的特点非常方便用来保存函数调用的上下文(这里建议大家学一点汇编),函数调用的时候,系统会将当前函数的各个寄存器R0-R11保存起来,然后加载调用函数的栈,待函数返回后,再将这个堆栈恢复出来。

这个时候你就可以理解,为什么有时候递归调用的时候容易堆栈溢出,因为函数一直没有返回,系统就会一直向堆栈里保存当前函数的上下文,超出了堆栈的大小,就会产生内存溢出的故障。

现在我们来做一个面试题:

1、单片机的静态变量存放在哪里?全局变量存放在哪里?局部变量又是存放在哪里?

小伙伴们,秀出你的答案吧,别忘了关注哦,下节我们讲bss、data、text段的涵义

,