本文参考了部分文章:
前言
经常说的堆栈,一般指栈。堆栈在不同环境的含义不同。数据结构中的堆栈是一种抽象的数据结构。尤其数据结构中堆的含义与STM32中的堆完全不是一个概念。
STM32 开发时,当我们没有没有主动申请内存时,是不会有堆区的。
STM32开发中不管堆区还是栈区都是指的RAM空间。
可以不设置堆的大小,如果使用了malloc等操作堆的函数,则必须定义堆的大小。
“不管堆栈设置的大小,编译出的HEX都是一样”的这句话在KEIL5.2,STM32F103环境下是错误的。
一、预备知识:
栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似 于数据结构中的栈。是一种分时使用的存储区域。1、堆栈在数据结构定义
栈:一种先进后出的数据结构。
堆:堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
2、在STM32中的表现
堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。存放的是全局变量,理论上是所有函数都可以访问的,该全局变量初始值并不存在RAM全局区。
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。
文字常量区:常量字符串就是存放在这里的。
程序代码区:存放函数体的二进制代码。
二、举例说明
在STM32中如果有以下代码int a=0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[]="abc"; //栈
char *p3= "1234567"; //在文字常量区Flash
static int c =0 ; //静态初始化区
p1= (char *)malloc(10); //堆区
strcpy(p1,"123456"); //"123456"放在常量区
}
所以堆和栈的区别:
1、stack的空间由操作系统自动分配/释放,heap上的空间手动分配(malloc)/释放(free)。
2、stack的空间有限,heap是很大的自由存储区。
3、程序在编译期和函数分配内存都是在栈上进行,且程序运行中函数调用时参数的传递也是在栈上进行。