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