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); 堆
}

猜你喜欢

转载自blog.csdn.net/u011764302/article/details/103368274