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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章