前提 四區
靜態區用於存放所有的全域性變數和靜態變數。
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.五大記憶體分割槽 堆 棧 全域性 靜態儲存區 字串常量區和 區。且不論以上兩種分割槽孰是孰非,孰優孰劣,我認為具體的記憶...