動態記憶體分配,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 輸...