任務清單
c語言在記憶體中一共分為5個區域:
記憶體棧區:存放區域性變數名由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,函式呼叫結束後釋放記憶體空間。
通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,用於在函式作用域內建立,在離開作用域後自動銷毀的變數的儲存區。通常是區域性變數,函式引數等的儲存區。他的儲存空間是連續的,兩個緊密挨著定義的區域性變數,他們的儲存空間也是緊挨著的,棧的大小是有限的。
記憶體堆區:存放new或者malloc出來的物件一般由程式設計師分配釋放,即動態記憶體的申請和釋放。 若程式設計師不釋放,程式結束時可能由os**。
通常是用於那些在編譯期間不能確定儲存大小的變數的儲存區,它的儲存空間是不連續的,一般由malloc(或new)函式來分配記憶體塊,並且需要用free(delete)函式釋放記憶體。如果程式設計師沒有釋放掉,那麼就會出現常說的記憶體洩漏問題。需要注意的是,兩個緊挨著定義的指標變數,所指向的malloc出來的兩塊記憶體並不一定的是緊挨著的,所以會產生記憶體碎片。
常數區:存放區域性變數或者全域性變數的值常量字串就是放在這裡的,程式結束後由系統釋放。
和「全域性/靜態儲存區」一樣,通常是用於那些在編譯期間就能確定儲存大小的常量的儲存區,並且在程式執行期間,儲存區內的常量是全域性可見的。這是一塊比較特殊的儲存去,他們裡面存放的是常量,不允許被修改。
靜態區:用於存放全域性變數或者靜態變數全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域(rw), 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域(zi),程式結束後有系統釋放。
和「棧」一樣,通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,但它用於的是在整個程式執行期間都可見的全域性變數和靜態變數。
**區:二進位制**存放函式體的二進位制**。
示例:pandas 是基於numpy 的一種工具,該工具是為了解決資料分析任務而建立的。
複習了c語言的儲存分割槽,我們用程式來驗證一下。
驗證**:
#include
#include
#include
void
before()
char g_buf[16]
;char g_buf2[16]
;char g_buf3[16]
;char g_buf4[16]
;char g_i_buf=
"123"
;char g_i_buf2=
"123"
;char g_i_buf3=
"123"
;void
after()
intmain
(int argc,
char
**ar**)
return0;
}
輸出結果:
分析:從輸出結果來看,第乙個框中的變數和第二個框中的變數都是全域性變數,且觀察出全域性變數的儲存位址是連續的,因為全域性變數是存放在靜態區的,所以靜態區的儲存位址是連續的;區域性變數三個陣列從輸出結果來看也是連續輸出的,即他們的位址也是連續的,區域性變數是儲存在記憶體棧區的,所以,棧區的儲存位址也是連續的;動態指標變數也是連續的儲存位址,這可能是因為申請的三個位址是連續申請的,中間沒有任何儲存位址被占用,所以是連續的位址,但是在實際應用中,並不一定是連續的儲存位址。
在keil中的程式和上面的程式相差無幾,所以這裡就不再展示程式內容。在keil中編譯、鏈結後,在串列埠中的輸出結果,如下圖所示:
C語言記憶體位址基礎(ZZ)
從計算機記憶體的角度思考c語言中的一切東東,是挺有幫助的。我們可以把計算機記憶體想象成乙個位元組陣列,記憶體中每乙個位址表示 1 位元組。比方說我們的電腦有 4k 記憶體,那這個記憶體陣列將會有 4096 個元素。當我們談論乙個儲存位址的指標時,就當相於我們在談論乙個儲存著該記憶體陣列某個元素索引的...
C語言記憶體位址對齊詳解
什麼是位址對齊?現代計算機中記憶體空間都是按照位元組 byte 劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排列,這就是對齊。為什麼要位址對齊?對齊的...
go語言記憶體,位址,指標
指標就是位址 列印出變數的記憶體和位址 a可以取到a的位址 簡單說可以說位址就是索引,就是門牌號,記憶體就是倉庫,裡面存了東西,存了值 package main import fmt func main int儲存int的位址,int儲存int的位址 定義乙個變數p,型別為 int var p in...