堆 棧 全域性變數的分配位址

2021-10-11 00:18:27 字數 1653 閱讀 6895

二、c語言程式裡全域性變數、區域性變數、堆、棧等概念,在keil中針對stm32系統進行程式設計,除錯變數,進行驗證; 通過串列埠輸出資訊到上位機,進行驗證。

#include

#include

int k1 =1;

int k2;

static

int k3 =2;

static

int k4;

intmain()

棧區-變數位址

i:0x7fffffffdc9c

p:0x7fffffffdca0

str:0x7fffffffdcce

堆區-動態申請位址

0x555555756260

0x555555756280

.bss段

全域性外部無初值 k2:0x555555755020

靜態外部無初值 k4:0x555555755024

靜態內部無初值 m2:0x555555755028

.data段

全域性外部有初值 k1:0x555555755010

靜態外部有初值 k3:0x555555755014

靜態內部有初值 m1:0x555555755018

常量區**區

這裡就可以清楚的看到不同型別的變數的儲存位置的變化。

可以大概總結出,棧向低記憶體位址生長,堆向高記憶體位址生長,全域性靜態變數向低記憶體位址生長,其他的全域性變數都是向高記憶體位址生長。

開啟mcuisp燒錄

stm32的**區和常量區都分配在0x08000000儲存位址(低位址)這一塊,全域性和靜態變數、棧區和堆區的位址都分配在0x20000000儲存位址(高位址)處。

stm32的棧區位址分配是按照高位址到低位址的方式進行分配,而堆區是按照低位址到高位址的方式進行分配,其他的區域基本上都按照從低位址向高位址的方式進行記憶體分配。

從keil軟體的option中可以看出關於stm32記憶體的起始位址和總大小。比如說,rom的起始位址為0x8000000,大小為0x80000;ram的起始位址為0x20000000,大小為0x10000。

linux 堆 棧 全域性變數存放

在學習 深入理解計算機系統 中鏈結這一章中,資料講乙個可執行檔案包含多個段。在linux系統中 段總是從0x08048000處開始,資料段在接下來的4kb對齊的位址處,執行時堆在接下來的讀寫段之後的第乙個4kb對齊的位址處,並通過呼叫malloc庫網上增長,開始於位址0x40000000處的段是為共...

linux 堆 棧 全域性變數存放

在學習 深入理解計算機系統 中鏈結這一章中,資料講乙個可執行檔案包含多個段。在linux系統中 段總是從0x08048000處開始,資料段在接下來的4kb對齊的位址處,執行時堆在接下來的讀寫段之後的第乙個4kb對齊的位址處,並通過呼叫malloc庫網上增長,開始於位址0x40000000處的段是為共...

static全域性變數 全域性變數

1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...