相信各位讀者應(yīng)該都聽過堆棧,那么它們是一個東西呢,還是兩個東西呢,它們有啥區(qū)別呢,這就是這篇推文介紹的五大內(nèi)存區(qū)。
|棧
棧(Stack):棧是一種自動分配和釋放內(nèi)存的區(qū)域,用于存儲函數(shù)的局部變量、函數(shù)參數(shù)、返回值等。棧內(nèi)存的分配和釋放是由編譯器自動完成的,它的大小是固定的。當(dāng)函數(shù)調(diào)用結(jié)束時,棧上分配的內(nèi)存會自動釋放。
#include"stdio.h" #include"stdlib.h" voidtest_1(unsignedchardata_1,unsignedintdata_2,unsignedchardata_3) { printf("data_1addr:0X%x ",&data_1); printf("data_2addr:0X%x ",&data_2); printf("data_3addr:0X%x ",&data_3); unsignedchartemp_1=0; unsignedchartemp_2=0; unsignedchartemp_3=0; printf("temp_1addr:0X%x ",&temp_1); printf("temp_2addr:0X%x ",&temp_2); printf("temp_3addr:0X%x ",&temp_3); } intmain() { test_1(10,11,12); return0; }
輸出:
data_1addr:0X61fe00 data_2addr:0X61fe08 data_3addr:0X61fe10 temp_1addr:0X61fdef temp_2addr:0X61fdee temp_3addr:0X61fded
解析:
C語言中函數(shù)參數(shù)的地址由于參數(shù)的大小可以不同,因此它們在棧中的相對位置不一定是連續(xù)的。局部變量會按變量占的空間遞減,棧區(qū)按內(nèi)存地址由高到低方向生長,其最大大小由編譯時確定,速度快,但自由性差,最大空間不大。
|堆
堆(Heap):堆是一種動態(tài)分配和釋放內(nèi)存的區(qū)域,用于存儲程序運行期間動態(tài)分配的內(nèi)存。堆內(nèi)存的分配和釋放需要手動進行,常用的函數(shù)有malloc()和free()。堆內(nèi)存的大小是可變的,它的生命周期由開發(fā)人員控制。
#include"stdio.h" #include"stdlib.h" intmain() { char*j=(char*)malloc(1); free(j); printf("add:0X%x ",j); return0; }
輸出:
add:0Xad13e0
解析:
堆區(qū)由程序員分配內(nèi)存和釋放。若程序員不釋放,程序結(jié)束時可能由操作系統(tǒng)回收。堆區(qū)按內(nèi)存地址由低到高方向生長,其大小由系統(tǒng)內(nèi)存/虛擬內(nèi)存上限決定,速度較慢,但自由性大,可用空間大。
|全局區(qū)
全局區(qū)(Global Area):全局區(qū)也稱為靜態(tài)區(qū),用于存儲全局變量和靜態(tài)變量。全局區(qū)在程序啟動時分配,在程序結(jié)束時釋放。全局變量和靜態(tài)變量的生命周期與程序的運行周期相同。全局區(qū)由.bss段 和 .data段組成:
.bss段存儲未初始化的全局變量和靜態(tài)變量。在程序執(zhí)行之前,編譯器會將.bss段中的變量初始化為0或者空指針。這些變量占據(jù)的內(nèi)存空間在編譯時已經(jīng)確定,但在程序執(zhí)行時才真正被分配。
#include"stdio.h" #include"stdlib.h" intdata_1; intdata_2; intmain() { staticintdata_3; staticintdata_4; printf("data_1add:0X%x ",&data_1); printf("data_2add:0X%x ",&data_2); printf("data_3add:0X%x ",&data_3); printf("data_4add:0X%x ",&data_4); return0; }
輸出:
data_1add:0X407974 data_2add:0X407970 data_3add:0X407030 data_4add:0X407034
.data段存儲已經(jīng)初始化的全局變量和靜態(tài)變量。在程序執(zhí)行之前,編譯器會為.data段中的變量分配內(nèi)存,并將其初始化為指定的初值。這些變量在程序運行期間一直存在,并且其內(nèi)存地址是固定的。
#include"stdio.h" #include"stdlib.h" intdata_1=0; intdata_2=0; intmain() { staticintdata_3=0; staticintdata_4=0; printf("data_1add:0X%x ",&data_1); printf("data_2add:0X%x ",&data_2); printf("data_3add:0X%x ",&data_3); printf("data_4add:0X%x ",&data_4); return0; }
輸出:
data_1add:0X407030 data_2add:0X407034 data_3add:0X407038 data_4add:0X40703c
可以理解為.bss段是存放未初始化全局變量和靜態(tài)變量的區(qū)域,而.data段是存放已初始化全局變量和靜態(tài)變量的區(qū)域。這樣的劃分可以有效地管理全局變量和靜態(tài)變量的內(nèi)存使用,并且在程序執(zhí)行期間保持其值的一致性。
|常量區(qū)
常量區(qū)(Constant Area):常量區(qū)用于存儲常量數(shù)據(jù),例如字符串常量。這些數(shù)據(jù)在程序運行期間保持不變,存儲在只讀內(nèi)存區(qū)域,無法修改。
#include"stdio.h" #include"stdlib.h" constintdata_1=100; constintdata_2=100; intmain() { staticconstintdata_3=100; staticconstintdata_4=100; conststaticintdata_5=100; conststaticintdata_6=100; printf("data_1add:0X%x ",&data_1); printf("data_2add:0X%x ",&data_2); printf("data_3add:0X%x ",&data_3); printf("data_4add:0X%x ",&data_4); printf("data_5add:0X%x ",&data_5); printf("data_6add:0X%x ",&data_6); return0; }
輸出:
data_1add:0X404000 data_2add:0X404004 data_3add:0X404070 data_4add:0X404074 data_5add:0X404078 data_6add:0X40407c
|代碼區(qū)
代碼區(qū)(Code Area):代碼區(qū)存儲程序的執(zhí)行代碼,也稱為文本區(qū)。這部分內(nèi)存是只讀的,存儲程序的機器指令。
審核編輯:湯梓紅
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3019瀏覽量
74002 -
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136683 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569 -
堆棧
+關(guān)注
關(guān)注
0文章
182瀏覽量
19753
原文標(biāo)題:C語言|內(nèi)存五大區(qū)
文章出處:【微信號:玩轉(zhuǎn)單片機,微信公眾號:玩轉(zhuǎn)單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論