sample code:
int i = 3; int j; void f () { int x = 4; int *p = malloc (sizeof(*p)); }
where are i, j, f, x, and p located?
业精于勤,荒于嬉;行成于思,毁于随。
很顯然,i和j做為全域變量,在程式的靜態儲存區;這塊區域在程式啟動時即被申請,同時在程式運作全程不被釋放。
i
j
x和p作為局部變量,分配在呼叫堆疊上。隨f()被呼叫時被分配,返回(退棧)時被釋放。
x
p
f()
f作為一個函數,儲存在記憶體的程式碼段。程式碼段的東西隨程式啟動時讀入內存,並且在程式運行全程不動。
f
p指向的記憶體被分配在堆上。 「堆」其實本質是系統動態分配給記憶體的空間——程式把從系統中動態申請下來的一段空間視為“堆”,並提供malloc()等靈活的分配功能。作業系統其實只知道一段記憶體被程式申請走,根本不知道這段記憶體的使用模型是「堆」。
malloc()
f:.text segment,i:.data segment,j:.bss segment,x,p:stack,x和p都是局部變量,存於上,但是p指向的記憶體空間處於heap上。
i,j在靜態區,x在堆疊區,p的內容在堆區
樣品—>樣品是->是
你看下面兩篇文章,講得很清楚的
ij在堆中xp在堆疊裡
http://segmentfault.com/a/1190000002575242
http://m.blog.csdn.net/blog/zhoucoolqi/7540612
很顯然,
i
和j
做為全域變量,在程式的靜態儲存區;這塊區域在程式啟動時即被申請,同時在程式運作全程不被釋放。x
和p
作為局部變量,分配在呼叫堆疊上。隨f()
被呼叫時被分配,返回(退棧)時被釋放。f
作為一個函數,儲存在記憶體的程式碼段。程式碼段的東西隨程式啟動時讀入內存,並且在程式運行全程不動。p
指向的記憶體被分配在堆上。 「堆」其實本質是系統動態分配給記憶體的空間——程式把從系統中動態申請下來的一段空間視為“堆”,並提供malloc()
等靈活的分配功能。作業系統其實只知道一段記憶體被程式申請走,根本不知道這段記憶體的使用模型是「堆」。f:.text segment,
i:.data segment,
j:.bss segment,
x,p:stack,
x和p都是局部變量,存於上,但是p指向的記憶體空間處於heap上。
i,j在靜態區,x在堆疊區,p的內容在堆區
樣品—>樣品是->是
你看下面兩篇文章,講得很清楚的
ij在堆中
xp在堆疊裡
http://segmentfault.com/a/1190000002575242
http://m.blog.csdn.net/blog/zhoucoolqi/7540612