C 記憶體布局 變數在堆疊的分配

2021-06-01 07:30:41 字數 1151 閱讀 4510

1.  變數的記憶體分布:

const變數儲存在.rodata(read only)區域;

char* p = "abcd"; p指向的是靜態文字區域.text

.rodata 和 .text 被合併為乙個segment,由os保護起來,只可讀。

register變數存放在.bss區域;

區域性變數存放在棧空間,static變數存放在靜態儲存空間 (.data)

.bss 和.data  被合併為乙個segment,可讀可寫。

變數在記憶體中的不同位置,影響著變數的讀寫方式。程式1很正常,因為p在棧上,可以修改。

view plain

const

char

* stra()    

程式2就會出錯。因為對於全域性區域的值,程式設計師是不可以修改的。

view plain

const

char

* stra()    

如果想要修改其值,可以宣告為靜態變數,這樣編譯器會在靜態儲存區域分配一塊空間。如程式3:

view plain

const

char

* stra()    

另外,乙個類中的靜態成員變數時不佔這個類的儲存空間的。

比如class a{}; class b;

sizeof(a) = sizeof(b) = 1

靜態成員應該在類定義體的外部初始化。static int b::m = 6;

const成員應該在初始化列表中初始化,除此之外,沒有任何地方可以改變它的值。

2.變數的堆疊分布

可以看到棧是從大到校,堆是從小到大。

我們可以通過程式來驗證:

#include #include using namespace std;  

class base

virtual void vfun1(){}

virtual int vfun2()

base()

int max(int a,int b)else

}

int main(int argc, char* argv)

{ int a=0;

cout<

C 堆疊以及記憶體分配

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類...

堆疊的記憶體分配

記憶體分配 遇到的問題 最近工作中遇到乙個bug,log顯示剛開始從buf中讀取的內容是正確的,但是將不同的指標指向buf中不同的起始位址,然後經過一些操作後,重新讀取這些指標指向的內容,發現內容不正確了。void cheange char name,char type char tmp sep i...

變數記憶體分配方式及堆疊的關係

變數的儲存方式有以下3種 自動分配 靜態分配和動態分配,其所佔記憶體區域和所對應的變數型別如下圖所示 棧,是系統為程式開闢的一塊活動儲存區,是按照 後進先出 的方式使用記憶體空間。自動分配是指在棧中為變數分配記憶體空間。對於系統自動分配記憶體空間的變數 一般的區域性變數 程式執行後,在變數的作用域開...