棧,堆,靜態區,是記憶體開闢的三個專屬區,C語言的記憶體分配也就只有這三種方式
1.記憶體在棧上建立(棧結構)
如函數里定義的變數inti;charstr[80],還有儲存函式的所有資訊的記憶體都是在棧上建立的
這塊記憶體是連續的,就好比是一個數組,所以你在記憶體分配的時候,會發現變數地址是連續的
2.記憶體在堆上建立(連結串列結構)
這塊記憶體是有很多記憶體塊組成,很像鞭炮一樣串在一根繩子上,但這些記憶體塊的大小不一樣,儲存在連結串列結構中的結點中,當你用malloc動態申請是,編譯器會根據你記憶體塊的大小從表頭一次檢索,直到連結串列中的記憶體塊大於等於你所申請的記憶體大小時,返回該快記憶體,如果連結串列上的記憶體塊大於你所申請的記憶體時,會將多餘記憶體回收到連結串列結構,這也就是為什麼動態申請記憶體容易造成記憶體碎片的產生原因。所以分配記憶體時你會發現他們的地址不連續
3記憶體在靜態區建立
如全域性變數,static變數
這塊記憶體也是連續的,也像一個數組,但它跟棧上建立記憶體唯一的區別是,記憶體作用時間不一樣,靜區記憶體作用時間是整個“程式”執行時間,棧上記憶體作用時間是整個“函式”的執行時間,注意“程式”和“函式”的區別
而堆記憶體作用時間範圍是0到整個“程式”執行時間,如果你要在小於整個“程式”執行時間內釋放這塊記憶體的話,就要使用free,所以是手動申請手動釋放,你自己可以控制,但是寫程式碼的好習慣習慣是程式中有幾個malloc就有幾個free,這樣可以防止記憶體洩露
棧,堆,靜態區,是記憶體開闢的三個專屬區,C語言的記憶體分配也就只有這三種方式
1.記憶體在棧上建立(棧結構)
如函數里定義的變數inti;charstr[80],還有儲存函式的所有資訊的記憶體都是在棧上建立的
這塊記憶體是連續的,就好比是一個數組,所以你在記憶體分配的時候,會發現變數地址是連續的
2.記憶體在堆上建立(連結串列結構)
這塊記憶體是有很多記憶體塊組成,很像鞭炮一樣串在一根繩子上,但這些記憶體塊的大小不一樣,儲存在連結串列結構中的結點中,當你用malloc動態申請是,編譯器會根據你記憶體塊的大小從表頭一次檢索,直到連結串列中的記憶體塊大於等於你所申請的記憶體大小時,返回該快記憶體,如果連結串列上的記憶體塊大於你所申請的記憶體時,會將多餘記憶體回收到連結串列結構,這也就是為什麼動態申請記憶體容易造成記憶體碎片的產生原因。所以分配記憶體時你會發現他們的地址不連續
3記憶體在靜態區建立
如全域性變數,static變數
這塊記憶體也是連續的,也像一個數組,但它跟棧上建立記憶體唯一的區別是,記憶體作用時間不一樣,靜區記憶體作用時間是整個“程式”執行時間,棧上記憶體作用時間是整個“函式”的執行時間,注意“程式”和“函式”的區別
而堆記憶體作用時間範圍是0到整個“程式”執行時間,如果你要在小於整個“程式”執行時間內釋放這塊記憶體的話,就要使用free,所以是手動申請手動釋放,你自己可以控制,但是寫程式碼的好習慣習慣是程式中有幾個malloc就有幾個free,這樣可以防止記憶體洩露