C++ 內存分區模型的使用(代碼區、全局區、棧區、堆區、new)
內存分區模型
1 代碼區
2 全局區
// 全局變量、靜態變量、常量
#include <iostream> using namespace std; // 全局變量、靜態變量、常量 //全局變量 int g_a=10; int g_b=10; //const修飾的全局常量 const int c_g_a = 10; const int c_g_b = 10; int main() { //創建普通局部變量 int a = 10; int b = 10; cout << "局部變量a的地址為:" << (int)&a << endl;//&a取地址,(int)強制轉換為10進制 cout << "局部變量b的地址為:" << (int)&b <<endl<<endl; //全局變量 cout << "全局變量g_a的地址為:" << (int)&g_a << endl; cout << "全局變量g_b的地址為:" << (int)&g_b << endl<<endl; //靜態變量 static int s_a = 10; static int s_b = 10; cout << "靜態變量s_a的地址為:" << (int)&s_a << endl; cout << "靜態變量s_b的地址為:" << (int)&s_b << endl << endl; //常量(字符串常量、const修飾的變量) //字符串常量 cout << "字符串常量的地址為:" << (int)&"hello word" << endl; //const修飾的變量(全局常量、局部常量) //const修飾的全局變量 cout << "全局常量 c_g_a的地址為:" << (int)&c_g_a << endl; cout << "全局常量 c_g_b的地址為:" << (int)&c_g_b << endl; //const修飾的局部變量 const int c_a = 10; const int c_b = 10; cout << "局部常量 c_a的地址為:" << (int)&c_a << endl; cout << "局部常量 c_b的地址為:" << (int)&c_b << endl << endl; system("pause"); return 0; }
總結
3 棧區
棧區註意事項
- 不要返回局部變量的地址
- 棧區的數據由編譯器管理開辟和釋放
#include <iostream> using namespace std; //棧區註意事項 //不要返回局部變量的地址 //棧區的數據由編譯器管理開辟和釋放 int *func(int b)//形參數據也存放在棧區 { b = 100; int a = 10;//局部變量:存放在棧區,棧區的數據在函數執行完畢自動釋放 return &a;//返回局部變量的地址 } int main() { //接受func函數的返回值 int *p=func(1); cout << *p << endl;//第一次可以打印正確的數字,因為編譯做瞭一次保留 cout << *p << endl;//第二次,就沒瞭,輸出亂碼 system("pause"); return 0; }
4 堆區
#include <iostream> using namespace std; int *func() { //利用new關鍵字,將數據開辟到堆區 //指針本質也是局部變量,存放在棧上,指針保存的數據存放咋堆區 int* p = new int(10); return p; } int main() { //在堆區開辟數據 int* q = func(); cout << *q << endl;//與上一個程序對比,多輸出幾次 cout << *q << endl; cout << *q << endl; cout << *q << endl; system("pause"); return 0; }
5 new運算符
#include <iostream> using namespace std; //1.new的基本語法 int* func() { //在堆區創建整形數據 //new返回的是數據類型指針 int* p = new int(10); return p; } //2.在堆區利用new 開辟數組 int main() { //在堆區開辟數據 int* q = func(); cout << *q << endl;//與上一個程序對比,多輸出幾次 cout << *q << endl; cout << *q << endl; //堆區數據是由程序員管理開辟、管理釋放 //如果想釋放堆區數據,利用關鍵字delete delete q; cout << *q << endl;//內存已被釋放,再次訪問就是非法操作,報錯 system("pause"); return 0; }
#include <iostream> using namespace std; //1.new的基本語法 //2.在堆區利用new 開辟數組 void test() { //創建10整形數據的數組,在堆區 int *arr =new int[10];//10代表數組有10個元素 for (int i = 0; i < 10; i++) { arr[i] = i + 100;//給10個元素賦值,100~109 } for (int i = 0; i < 10; i++) cout << arr[i] << endl; //釋放堆取數組 //釋放數組的時候,要加[]才可以,否則認為是隻是放一個元素 delete[] arr; } int main() { test(); system("pause"); return 0; }
註意:
- 釋放堆取數組
- 釋放數組的時候,要加[]才可以,否則認為是隻是放一個元素
參考:
嗶哩嗶哩 黑馬程序員
到此這篇關於C++ 內存分區模型的使用(代碼區、全局區、棧區、堆區、new)的文章就介紹到這瞭,更多相關C++ 內存分區模型內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!