本文主要是介绍STM32 堆、栈、内存分配-精华详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
STM32内存分为3块区域:全局/静态变量区、栈区、堆区
其中全局/静态变量区用于存放全局/静态变量(包括指针变量),
栈区用于存放当前运行的函数及其中定义的局部变量和程序指针等,
堆区用于存放动态申请的内存,即malloc的内存。
栈向小地址增长,堆向大地址增长。
内存首先存放/开辟全局变量区域,然后开辟栈区最后开辟堆区。
注意,堆区是用于动态申请内存的,所以程序中如果没有动态申请内存则堆区无用,可以不用管 Heap_Size;如果程序有动态申请内存,则注意Heap_Size(即堆的首地址)一定要大于 全局区+栈区 大小,否则堆区会被覆盖导致程序出错。
栈区的首地址是编译器自动分配的,栈首地址=全局区域大小+栈大小(Stack_Size)。
本文于 2019-12-9 最后更新,之前关于栈有说错的地方,在此对在这之前有看过并受到影响的同志表示诚挚的歉意!
下面看一个经典例子:
main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆
}
这篇关于STM32 堆、栈、内存分配-精华详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!