相信各位讀者應該都聽過堆棧,那么它們是一個東西呢,還是兩個東西呢,它們有啥區別呢,這就是這篇推文介紹的五大內存區。
|棧
棧(Stack):棧是一種自動分配和釋放內存的區域,用于存儲函數的局部變量、函數參數、返回值等。棧內存的分配和釋放是由編譯器自動完成的,它的大小是固定的。當函數調用結束時,棧上分配的內存會自動釋放。
#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語言中函數參數的地址由于參數的大小可以不同,因此它們在棧中的相對位置不一定是連續的。局部變量會按變量占的空間遞減,棧區按內存地址由高到低方向生長,其最大大小由編譯時確定,速度快,但自由性差,最大空間不大。
|堆
堆(Heap):堆是一種動態分配和釋放內存的區域,用于存儲程序運行期間動態分配的內存。堆內存的分配和釋放需要手動進行,常用的函數有malloc()和free()。堆內存的大小是可變的,它的生命周期由開發人員控制。
#include"stdio.h" #include"stdlib.h" intmain() { char*j=(char*)malloc(1); free(j); printf("add:0X%x ",j); return0; }
輸出:
add:0Xad13e0
解析:
堆區由程序員分配內存和釋放。若程序員不釋放,程序結束時可能由操作系統回收。堆區按內存地址由低到高方向生長,其大小由系統內存/虛擬內存上限決定,速度較慢,但自由性大,可用空間大。
|全局區
全局區(Global Area):全局區也稱為靜態區,用于存儲全局變量和靜態變量。全局區在程序啟動時分配,在程序結束時釋放。全局變量和靜態變量的生命周期與程序的運行周期相同。全局區由.bss段 和 .data段組成:
.bss段存儲未初始化的全局變量和靜態變量。在程序執行之前,編譯器會將.bss段中的變量初始化為0或者空指針。這些變量占據的內存空間在編譯時已經確定,但在程序執行時才真正被分配。
#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段存儲已經初始化的全局變量和靜態變量。在程序執行之前,編譯器會為.data段中的變量分配內存,并將其初始化為指定的初值。這些變量在程序運行期間一直存在,并且其內存地址是固定的。
#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段是存放未初始化全局變量和靜態變量的區域,而.data段是存放已初始化全局變量和靜態變量的區域。這樣的劃分可以有效地管理全局變量和靜態變量的內存使用,并且在程序執行期間保持其值的一致性。
|常量區
常量區(Constant Area):常量區用于存儲常量數據,例如字符串常量。這些數據在程序運行期間保持不變,存儲在只讀內存區域,無法修改。
#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
|代碼區
代碼區(Code Area):代碼區存儲程序的執行代碼,也稱為文本區。這部分內存是只讀的,存儲程序的機器指令。
審核編輯:湯梓紅
-
內存
+關注
關注
8文章
2998瀏覽量
73881 -
C語言
+關注
關注
180文章
7598瀏覽量
136172 -
函數
+關注
關注
3文章
4304瀏覽量
62427 -
堆棧
+關注
關注
0文章
182瀏覽量
19731
原文標題:C語言|內存五大區
文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論