在空間中的記憶體分配如圖所示
通過以下程式可以更加清晰的看出位址之間的聯絡:
#include
int add(int a, int const e)
int main(void)
; char str2[10];
printf("allover(eval) &a = %p\n", &a);
printf("allover(null) &b = %p\n", &b);
printf("array(eval) &str1 = %p\n", str1);
printf("array(null) &str2 = %p\n", str2);
b = add(3, 4);
return
0;}
執行結果如下所示
allover(eval) &a = 0xbf803820
allover(null) &b = 0xbf80381c
array(eval) &str1 = 0xbf803812
array(null) &str2 = 0xbf803808
local(null) &c = 0xbf8037e4
local(eval) &d = 0xbf8037e0
const e = 0xbf8037f4
static &f = 0x8049714
由此可知全域性變數裡,不論是一般變數,還是陣列,為定義的儲存在bss段,而定義的儲存在之後的.data段裡。
區域性變數就全部儲存在棧空間,在資料堆之上。
static修飾的變數全部儲存在.data段。
const修飾的在一定程度上屬於唯讀常量,所以存在rodata段。
Linux下的記憶體分配
1.夥伴演算法 一種物理記憶體分配和 的方法,物理記憶體所有空閒頁都記錄在buddy鍊錶中。首選,系統建立乙個鍊錶,鍊錶中的每個元素代表一類大小的物理記憶體,分別為2的0次方 1次方 2次方,個頁大小,對應4k 8k 16k的記憶體,沒一類大小的記憶體又有乙個鍊錶,表示目前可以分配的物理記憶體。例如...
windos下的記憶體分配
最近封裝dll庫,發現程式推出的時候總是會有一些log,顯示部分記憶體沒有 除錯發現,這些沒有 的記憶體不是我的 的邏輯造成,而是和dll的一些特性相關。然後研究了一下,windows下的記憶體分配的相關知識。crtd malloc dbg 是debug模式下,new操作實際呼叫的函式,這個函式會分...
Linux系統的記憶體分配
bss block started by symbol 通常是指用來存放程式中未初始化的全域性變數和靜態變數的一塊記憶體區域。特點是 可讀寫的,在程式執行之前bss段會自動清0。所以,未初始的全域性變數在程式執行之前已經成0了。資料段 資料段 data segment 通常是指用來存放程式中已初始化...