C的儲存區

2021-06-01 18:07:32 字數 1516 閱讀 5179

1.概述

在c中一般分為這幾個儲存區:

1) **段區域(code segment):放置程式**的區域,沒有什麼好多說的;

2)  常量區域:放置程式中的常量,如以const作為字首定義的,**中形如"abcdef"的字串,該區域內存在程式結束時釋放;

3)  初始化的全域性/靜態區域:全域性變數和靜態變數的儲存是放在一塊的,該區域在程式結束釋放;

4)  未初始化的全域性/靜態區域(bss):同上,就是沒有把變數進行初始化;

5)  棧(stack): 由編譯器自動分配釋放;

6)  堆(heap):  一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**;

2.說明

在函式體中定義的區域性變數是在棧上分配的,用malloc, calloc, realloc等分配記憶體的函式分配得到的就是在堆上。在所有函式體外定義的是全域性量,加了static修飾符後不管在**都存放在全域性區(靜態區),在所有函式體外定義的static變數表示在該檔案中有效,不能extern到別的檔案用,在函式體內定義的static表示只在該函式體內有效。另外,函式中的"adgfdf"這樣的字串存放在常量區。

比如:

int  a = 0; 

//全域性初始化區

char *p1; 

//全域性未初始化區

void main()

int b;  

// 棧

char s = "abc"; 

// s在棧中,abc\0在常量區

char *p2; 

// 棧

char *p3 = "123456"; 

// 123456\0在常量區,p3在棧中

static int c =0; 

// 全域性(靜態)初始化區

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);  // 分配得來得10和20位元組的區域就在堆區。

strcpy(p1, "123456"); 

// 123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一塊(加了-o2)。

還有就是函式呼叫時會在棧上有一系列的保留現場及傳遞引數的操作。 

棧的空間大小有限定,很多多工的作業系統在建立任務時指定。棧不夠用的情況一般是程式中分配了大量區域性陣列,大結構區域性變數和函式呼叫的層次太深。有一點必須知道,當乙個函式呼叫完返回後它會釋放該函式中所有的棧空間。棧是由編譯器自動管理的,不用你操心。

堆是動態分配記憶體的,並且你可以分配使用很大的記憶體。但是用不好會產生記憶體洩漏。並且頻繁地malloc和free會產生記憶體碎片(有點類似磁碟碎片),因為c分配動態記憶體時是尋找匹配的記憶體的,如果系統中的記憶體碎片很多,儘管還有許多free的,但由於都被切碎了,沒有一整塊的大內寸,這樣會導致分配大塊記憶體時失敗(不要過於依賴作業系統對記憶體碎片的整合)。在一些資料庫相關的大型的軟體開發過程中,需要頻繁地分配釋放記憶體,這時就需要用記憶體池(會增加額外的管理開銷)來解決碎片問題。而用棧則不會產生碎片。

c語言儲存區 堆疊靜態儲存區

棧 由編譯器自動分配釋放,其中存放在主調函式中被呼叫函式的下一句 函式引數和區域性變數,容量有限 堆由程式設計師自己分配釋放 用malloc和free,或new和delete 如果我們不手動釋放,那就要到程式結束才釋放。如果對分配的空間在不用的時候不釋放而一味的分配,那麼可能會引起記憶體洩漏,其容量...

C與C 的儲存區

c 儲存區 全域性變數與靜態變數區 常量區 區域性變數區 棧 動態儲存區 堆 自由儲存區 1 全域性變數與靜態變數區 存放全域性變數 靜態變數,程式執行結束後釋放 2 常量區 文字區 存放常量 3 區域性變數區 棧 存放區域性變數 函式引數。由編譯器控制,自動分配和釋放 4 動態儲存區 堆 mall...

C 資料儲存區

段 也稱文字段 用來存放程式執行 的記憶體區。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀,某些架構也允許 段為可寫,即允許修改程式。在 段中,也有可能包含一些唯讀的常數變數,例如字串常量等。棧 stack 就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區...