棧區(stack)
函數運作時配置設定,函數結束時釋放。由編譯器自動配置設定釋放 ,存放為運作函數而配置設定的局部變量、函數參數、傳回資料、傳回位址等。其操作方式類似于資料結構中的棧。
堆區(heap)
一般由程式員配置設定釋放, 若程式員不釋放,程式結束時可能由OS(作業系統)回收。配置設定方式類似于連結清單。
如何了解棧區
局部變量的位址存于棧區,編譯器會做一次保留,第二次調用則被釋放
#include<iostream>
using namespace std;
// 棧區資料的注意事項 --- 不要傳回局部變量的位址
// 棧區的資料由編譯器管理開辟和釋放
int * func(int b) // 形參資料也會放在棧區
{
b = 100;
int a = 10; // 局部變量。存放在棧區。棧區的資料在函數執行完後自動釋放
return &a; // 傳回局部變量的位址
}
int main1() //注意一個項目中main函數不能重名
{
int * p = func(1);
cout << *p << endl; // 編譯器做一次保留,是以第一次可以列印正确
cout << *p << endl; // 第二次這個資料不再做保留
system("pause");
return 0;
}
如何了解堆區

使用new關鍵字開辟堆區,将10存放于堆區,位址号為0x0011
當 int *p = new int(10); 後 在棧區中存放指向堆區資料10的指針,即存放位址号0x0011,
當主程式裡面
int * p = func(1);
後 *p 已經被傳回了指針p指向的資料10,p已經被規定為指向堆區的
0x0011,而堆區的資料不會被程式釋放。是以多次輸出不變。
#include<iostream>
using namespace std;
int * func()
{
// 利用new關鍵字,可以将資料開辟到堆區
int *p = new int(10);
return p;
}
int main() //注意一個項目中main函數不能重名
{
// 在堆區開辟資料
int *p = func();
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}