天天看點

關于棧區、堆區的了解

棧區(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;

}
           

繼續閱讀