C的記憶體四大區

2021-09-08 15:02:49 字數 2268 閱讀 1374

前提 四區

靜態區

用於存放所有的全域性變數和靜態變數。

int a=10; //

靜態區int

main()

**區

就是存放程式的執行**,執行時該區內容不可修改。

棧區

用於存放所有的區域性auto變數(非static,非register等),先進後出原則!

需要說明的是,棧區通常比較小,以kb為單位!所以存在overstack的可能性!--也就是俗稱的爆棧~

int max(int &a, int &b)

intmain()

堆區

空間較大,需要手動分配及釋放,如果忘記釋放,存在溢位可能。

堆空間比較自由,沒有進出的順序。

c語言中使用void *p = malloc

(size)分配空間,使用free(p)釋放空間。

需要注意的是,分配後,空間會有殘餘內容,需要手動清理。

int *p = (int*) malloc( sizeof(int) * 10 ); //

分配了40個位元組

free(p); //

釋放了分配的空間。

以上,面試的時候通常會問到什麼時候會棧溢位,根據棧區的定義,只要區域性變數的總長度超出棧長度即可。

例如,

int arr[1024*1024*1024]=; //

棧空間,超長

while(1)//

或者,遞迴次數太多!

注意,malloc分配的空間並未提供初始化,所以需要手動初始化。

memset(p, initval, len); //

將p位址開始的len長度範圍內的空間的值初始化為initval。

c中提供了另外兩個函式來操作堆空間。

void *calloc(size_t _numofelements, size_t _sizeofelement); //

需要提供元素型別的數量及長度

void *realloc(void *p, size_t _newsize); //

重新分配空間。需要提供原空間位址以及新空間的長度。注意,如果原位址沒有足夠的連續空間,那會複製到新空間,並釋放原空間。

realloc會返回新的空間位址(或者和原位址相同),或者返回null(0)--如果堆中任何地方都沒有足夠的空間!

另外,其超出原空間長度的部分,內容不會初始化。

測試**

#include #include 

#include /**

* @brief test_heap 驗證c函式形參是從右往左壓入棧中

* @param a

* @param b */

void test_heap(int a, int

b) int

main()

//手動清零

memset(pi, 0, 10 * sizeof(int)); //

注意,這裡的長度單位是位元組

for (int i = 0; i != 10; ++i)

free

(pi);

// pi = (int *)calloc(10, sizeof(int)); //

calloc

for (int i = 0; i != 10; ++i)

//free(pi);

//note this and realloc

printf(

"after free, pi = %d\n

", pi);

int *pi2 = (int *)realloc(pi, 80); //

20是比原來短了。注意,如果使用pi,則之前不能free(pi)。

printf("

after realloc, pi = %d\n

", pi);

printf(

"after realloc, pi2 = %d\n

", pi2); //

如果整個堆當中都沒有任何一處的記憶體能夠滿足realloc的需求。則此次分配失敗,返回值為null

for (int i = 0; i != 20; ++i)

free

(pi2);

free(pi); //

free(pi2) is ok

// test_heap(3, 5

);

return0;

}

HTTP和HTTPS的四大區別

http和https的區別 在web開發學習中,我們會很頻繁的接觸到http這個協議。從概念上來說,超文字傳輸協議 http,hypertext transfer protocol 是網際網路上應用最為廣泛的一種網路協議。所有的www檔案都必須遵守這個標準。通俗來講,http就是瀏覽器和伺服器進行互...

C 四大演算法

氣泡排序 using system namespace bubblesorter j public class mainclass bubblesorter sh new bubblesorter sh.sort iarrary for int m 0 m iarrary.length m cons...

C C 的四大記憶體分割槽

正確的理解c c 程式的記憶體分割槽,是合格程式猿的基本要求。網路上流形兩大版本記憶體分割槽,分別為 1.五大記憶體分割槽 堆 棧 全域性 靜態儲存區 自由儲存區和常量儲存區。2.五大記憶體分割槽 堆 棧 全域性 靜態儲存區 字串常量區和 區。且不論以上兩種分割槽孰是孰非,孰優孰劣,我認為具體的記憶...