程式的記憶體分配

2021-07-11 09:40:39 字數 1607 閱讀 4492

乙個有c或c++編寫的程式,程式**的記憶體分配方式有以下幾種

1:棧(stack),棧是由編譯器自動的動態為**中的區域性變數和形參分配儲存空間,當區域性變數和形參所在的函式被呼叫完之後,編譯器會立刻釋放該區域性變數或是形參的記憶體空間。如果該區域性變數所在的函式被程式多次呼叫,那麼該區域性變數和形參的記憶體空間就會被多次重新分配和釋放,並且每次分配的記憶體空間是動態隨機的,因此當區域性變數沒被初始化時,該區域性變數的值是不確定。

2:堆(heap),是程式要通過某些函式如malloc()等申請的記憶體,這種記憶體必須有程式設計師手動去釋放,若程式設計師不釋放,那麼當程式完全執行完之後,由系統去釋放。

3:全域性區,也稱為靜態區(static)。程式中宣告的靜態變數和全域性變數它們的記憶體空間是一樣的,都在全域性區。全域性區又分為資料區段和bbs段,其中資料區主要儲存的是已經初始化了的全域性變數和靜態變數,而bbs段主要儲存未初始化了的全域性變數和靜態變數,記憶體空間有程式結束後釋放。

4:**區(**段)是用來儲存程式編譯後的二進位制檔案的,記憶體空間有程式結束後釋放。

5:文字常量區,用來存放我們在程式中定義的常量字串的,記憶體空間有程式結束後釋放。

二、例子程式(

網上找的乙個例子)

int a = 0;          // 全域性初始化區

char *p1;           // 全域性未初始化區

main(void)

一下內容也是別人的總結,總結的挺好我直接搬過來了

static全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通區域性變數有什麼區別?static函式與普通函式有什麼區別?

static全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通區域性變數有什麼區別?static函式與普通函式有什麼區別?   

答:1) 全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是

整個源程式, 當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它

。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。

2) 從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。                   

3) static函式與普通函式作用域不同,僅在本檔案

。只在當前原始檔中使用的函式應該說明為內部函式(static),

內部函式應該在當前原始檔中說明和定義

。對於可在當前原始檔以外使用的函式,

應該在乙個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案

綜上所述:

static全域性變數與普通的全域性變數有什麼區別:

static全域性變數只初使化一次,防止在其他檔案單元中被引用;   

static區域性變數和普通區域性變數有什麼區別:

static函式與普通函式有什麼區別:

static函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝

程式的記憶體分配

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

程式的記憶體分配

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

程式的記憶體分配

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