C語言記憶體位址

2021-10-11 09:41:55 字數 2106 閱讀 3847

任務清單

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...