淺談c/c++與內存中的棧(stack)和堆(heap)區別,全局區等

1、棧區(stack)― 由編譯器自動分配釋放 ,存放函數局部變量,函數返回值等,沒有特別標定的大部分函數內部變量,臨時值等都存儲在stack上,自動分配/回收。

2、堆區(heap) ― 一般由程序員分配釋放, c++對應的是關鍵字new,c對應的是關鍵字malloc,也被稱作動態分配內存,分配的區域就是在堆區。若程序員不釋放,程序結束時可能由系統回收 。

一個程序的memory內存中往往棧的空間有限,所以有個詞叫爆棧(overflow),而堆的空間往往比棧大,更靈活。

所以c++創建實例大致上可分爲兩類:在stack上創建和在heap上創建。

C++中內存分成5個區,分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。

int a = 0; // 全局初始化區
char *p1;  // 全局未初始化區
void main()
{
  int b; //棧
  char s[] = "abc"; // 棧
  char *p2; // 棧
  char *p3 = "123456"; // 123456\0在常量區,p3在棧上。

  static int c =0// 全局(靜態)初始化區

  p1 = new char[10];
  p2 = (char *)malloc(20); //  分配的10和20字節的區域就在堆區。

  strcpy(p1, "123456");    //123456\0放在常量區,編譯器可能會將
                          // 它與p3所指向的"123456"優化成一個地方。
}  

參考博客

順便提一個小tips,在oj算法題中大的數組比如int[1000005],在main函數裏面定義基本都崩掉,寫在main函數外面作爲全局變量一般不會,而且有默認初始值,這個全局變量存儲是在全局/靜態存儲區。

#include <iostream>
int a[100000005];//本人系統測試最高是這個數量級,全局區,可通過編譯運行
int main(){
    std::cout<<"test Successfully"<<std::endl;
    return 0;
}

經過測試,個人電腦,全局區要是再大的數量級,會出現Error: value of 0000000xxxxxxx too large for field of 4 bytes at 0000000xxxxxxx 之類的錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章