C語言記憶體分布

2021-10-09 13:23:44 字數 4459 閱讀 8734

動態記憶體分配,c語言動態記憶體分配詳解

c語言知識總結(十一)記憶體管理

c語言記憶體分布圖

**段:const常量,字串常量

資料段:已初始化全域性變數、已初始化全域性靜態變數、區域性靜態變數、常量資料

bss段:未初始化全域性變數、未初始化全域性靜態變數

棧:區域性變數、函式引數

堆:動態記憶體分配

棧(stack)是從高位元組向低位元組分配記憶體的,堆(heap)是從低位元組向高位元組分配記憶體的

通過下面的一段**,應該可以深刻的理解c語言的記憶體分布了。

#include

#include

#include

const

int g_a =10;

//**段

const

int g_a_a;

int g_b =20;

//資料段

static

int g_c =30;

//資料段

static

int g_d;

//bss段

int g_e;

//bss段

int g_f;

//bss段

char

*p1;

//bss段

intmain()

放在常量區,編譯器可能會將它與p3所指向 的"123456"優化成一塊

printf

("hight address\n");

printf

("-------------棧--------------\n");

printf

("棧, 區域性變數, local_a, addr:0x%08x\n"

,&local_a)

;printf

("棧, 區域性變數,(後進棧位址相對local_a低) local_b, addr:0x%08x\n"

,&local_b)

;printf

("棧, 區域性變數,(後進棧位址相對local_b低) p3, addr:0x%08x\n"

,&p3)

;printf

("棧, 區域性變數,(後進棧位址相對p3低) p4, addr:0x%08x\n"

, p4)

;printf

("棧, 區域性變數,(後進棧位址相對p3低) &p4, addr:0x%08x\n"

,&p4)

;printf

("-------------堆--------------\n");

printf

("堆, malloc分配記憶體, p1, addr:0x%08x\n"

, p1)

;printf

("------------bss段------------\n");

printf

("bss段, 全域性變數, 未初始化 g_e, addr:0x%08x\n"

,&g_e)

;printf

("bss段, 全域性變數,(和上面的那個全域性變數位址臨近) 未初始化 g_f, addr:0x%08x\n"

,&g_f)

;printf

("bss段, 全域性變數 未初始化 p1, addr:0x%08x\n"

,&p1)

;printf

("bss段, 靜態全域性變數, 未初始化,(下面三個靜態變數位址臨近) g_d, addr:0x%08x\n"

,&g_d)

;printf

("bss段, 靜態區域性變數, 初始化, local_c, addr:0x%08x\n"

,&local_c)

;printf

("bss段, 靜態區域性變數, 未初始化, local_d, addr:0x%08x\n"

,&local_d)

;printf

("-----------資料段------------\n");

printf

("資料段,全域性變數, 初始化 g_b, addr:0x%08x\n"

,&g_b)

;printf

("資料段,靜態全域性變數, 初始化, g_c, addr:0x%08x\n"

,&g_c)

;printf

("-----------**段------------\n");

printf

("**段,全域性初始化變數, 唯讀const, g_a, addr:0x%08x\n"

,&g_a)

;printf

("**段,全域性初始化變數, 唯讀const, g_a_a, addr:0x%08x\n"

,&g_a_a)

;printf

("**段,全域性初始化變數, 唯讀const, g_a_b, addr:0x%08x\n"

,&g_a_b)

;printf

("**段,全域性初始化變數, 唯讀const, g_a_c, addr:0x%08x\n"

,&g_a_c)

;printf

("**段,指向字串常量, p3, addr:0x%08x\n"

, p3)

;printf

("low address\n");

return0;

}

輸出結果如下:

hight address

-------------棧--------------

棧, 區域性變數, local_a, addr:0x0061fe14

棧, 區域性變數,(後進棧位址相對local_a低) local_b, addr:0x0061fe10

棧, 區域性變數,(後進棧位址相對local_b低) p3, addr:0x0061fe08

棧, 區域性變數,(後進棧位址相對p3低) p4, addr:0x0061fe02

棧, 區域性變數,(後進棧位址相對p3低)

&p4, addr:0x0061fe02

-------------堆--------------

堆, malloc分配記憶體, p1, addr:0x00192410

------------bss段------------

bss段, 全域性變數, 未初始化 g_e, addr:0x0040797c

bss段, 全域性變數,(和上面的那個全域性變數位址臨近) 未初始化 g_f, addr:0x00407980

bss段, 全域性變數 未初始化 p1, addr:0x00407970

bss段, 靜態全域性變數, 未初始化,(下面三個靜態變數位址臨近) g_d, addr:0x00407030

bss段, 靜態區域性變數, 初始化, local_c, addr:0x00407034

bss段, 靜態區域性變數, 未初始化, local_d, addr:0x00407038

-----------資料段------------

資料段,全域性變數, 初始化 g_b, addr:0x00403010

資料段,靜態全域性變數, 初始化, g_c, addr:0x00403014

-----------**段------------

**段,全域性初始化變數, 唯讀const, g_a, addr:0x00404000

**段,全域性初始化變數, 唯讀const, g_a_a, addr:0x00407978

**段,全域性初始化變數, 唯讀const, g_a_b, addr:0x0061fe1c

**段,全域性初始化變數, 唯讀const, g_a_c, addr:0x0061fe18

**段,指向字串常量, p3, addr:0x00404004

low address

C語言 記憶體分布詳解

一 乙個c c 程式占用的記憶體分為以下幾個部分 堆區 heap 全域性 靜態區 static 示例 int a 10 全域性變數 全域性 靜態 初始化區 int i 全域性變數 全域性 靜態 未初始化區 main char s1 abcdef s1 在靜態區,abcdef 無需額外存放,存在陣列s...

C語言程式記憶體分布

乙個程序的資料在記憶體中的布局如下圖 bss段 bss segment 可讀可寫不可執行,通常用來存放程式中未初始化的全域性變數。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。data段 data segment 可讀可寫不可執行,通常用來存放程式中已...

C記憶體分布

先看一下測試 include include int g val int g ival 5 char g ptr char g iptr hongchunhua static int s val static int s ival 5 int print add int val int main 輸...