0基礎學C++ | 第10天 | 基礎知識 |程序的內存模型 | 4大分區

前言

第9天是一個通訊錄管理系統案例,現在了解程序的內存分區,C++程序在執行時,將內存大方向分為了4個區域,分別是代碼區、全局區、棧區、堆區,分區的目的就是為了更加靈活的編程。

代碼區 and 全局區(程序前)

在程序編譯后,生成了exe可執行文件,未執行該程序前分為兩個區:代碼區和全局區

代碼區:

存放CPU執行的指令

代碼區是共享的,共享的目的是對于頻繁被執行的程序,只需要在內存中有一份代碼即可

代碼區是只讀的,使其只讀的原因是防止程序意外地修改了它的指令,

全局區:

全局變量靜態變量存放在此

全局變量還包含了常量區,字符串常量和其他常量

該區域的數據在程序結束后由操作系統釋放

#include<iostream>
using namespace std;//全局變量
int g_a = 10;
const int c_g_a = 10; //const修飾的全局變量,相當于全局常量int main()
{//局部變量int l_a = 10;cout<< "局部變量l_a的地址:" <<(int)&l_a<<endl;//靜態變量 static int s_a = 10;cout<< "靜態變量s_a的地址:" <<(int)&s_a<<endl;//常量//字符串常量cout<< "字符串常量的地址" <<(int)&"hello world"<<endl;//const修飾的變量//const修飾的全局變量cout<< "const修飾的全局變量c_g_a的地址:" <<(int)&c_g_a<<endl;
}

棧區and堆區(程序運行后)

棧區:

由編譯器自動分配釋放,存放函數的參數值,局部變量

注意:不要返回局部變量的地址,棧區開辟的數據由編譯器自動編譯

堆區:

由程序員分配釋放,若程序不釋放,程序結束時由操作系統回收

在C++中主要利用new在堆區中開辟內存

#include<iostream>
using namespace std;int* func(int b) //形參數據也會存放在棧區
{b=100;int a = 10; //局部變量 存放在棧區,棧區的數據在函數執行完后自動釋放return &a; //返回局部變量的地址
}int main()
{//接收func函數的返回值int * p = func();cout<<*p<<endl; //第一次打印正確的數字10,因為編譯器做了保留cout<<*p<<endl; //第2次打印出現亂碼
}

?堆區開辟

?//在堆區開辟數據湖
#include<iostream>
using namespace std;int* func() 
{//利用new開辟堆區int *p = new int(10);     //指針變量放在棧區,數據放在堆區return p; //返回局部變量的地址
}int main()
{//接收func函數的返回值int * p = func();cout<<*p<<endl; //第一次打印正確的數字10,因為編譯器做了保留cout<<*p<<endl; //第2次打還是10
}

new操作符

C++中利用new操作符在堆區開辟數據湖,堆區開辟的數據,由程序員手動開辟,手動釋放,釋放利用delete

語法:new 數據類型

利用new創建的數據,會返回該數據對應的類型的指針

#include<iostream>
using namespace std;//new的基本語法
int* func() 
{//在堆區創建整型數據//new返回是 該數據類型的指針int *p = new int(10);   return p; 
}void test01() 
{int *p = func();   cout << *p <<endl; //如果要釋放,利用delete關鍵字delete p;cout << *p <<endl; //再打印時就打印不出來了
}//在堆區利用new開辟數組
void test02() 
{int * arr = new int[10];for(int i=0;i<10;i++){arr[i] = i + 100; //給10個元素賦值}for(int i=0;i<10;i++){cout << arr[i] <<endl; //打印數組中的值}//如果要釋放,利用delete關鍵字delete[] arr; //釋放數組要加[]才可以
}
int main()
{//接收func函數的返回值int * p = func();cout<<*p<<endl; //第一次打印正確的數字10,因為編譯器做了保留cout<<*p<<endl; //第2次打還是10
}?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38804.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38804.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Echarts柱狀圖x軸刻度間隔顯示不全/x軸文字傾斜

此情況一般是因為x軸文字過長導致&#xff0c;知道什么原因&#xff0c;就可以解決了 在xAxis里面加 xAxis: {axisLabel: {interval: 0,rotate: -45 //文字過多時&#xff0c;傾斜角度}} 控制它的屬性是axisLabel&#xff0c;該屬性interva設置成0則表示強制顯示所有標簽&a…

這所985院校不保護一志愿,18人不合格被刷!西北農林科技大學計算機考研考情分析!

西北農林科技大學(Northwest A&F University)&#xff0c;簡稱“西農”或“西北農林”&#xff0c;始創于1934年&#xff0c;位于中華人民共和國陜西省楊凌示范區。1999年9月11日由同處楊凌的原西北農業大學、西北林學院、中國科學院水利部水土保持研究所、水利部西北水利科…

外籍學員報到,四川眼科醫院開啟國際屈光手術專科醫生培訓

“能夠來到中國、來到四川眼科醫院學習&#xff0c;我真的很幸運&#xff01;”這個夏天&#xff0c;對于馬來西亞眼科醫生Ivan Cheng En Yoo來說&#xff0c;充滿了期待和挑戰。他是首位來到四川眼科醫院進修學習的馬來西亞籍醫生&#xff0c;Ivan Cheng將在周進院長的帶領下&…

Android Gradle 開發與應用 (三): 依賴管理與版本控制

目錄 1. 依賴管理的重要性 1.1 依賴的類型 1.2 Gradle 中的依賴聲明 2. 版本控制的策略 2.1 固定版本與動態版本 2.2 版本沖突的解決 3. Gradle 插件的使用 3.1 常用的 Gradle 插件 3.2 自定義插件 4. 多模塊項目中的依賴管理 4.1 模塊間依賴 4.2 公共依賴 5. 依賴…

用“文心一言”寫的文章,看看AI寫得怎么樣?

?零售連鎖店的“支付結算”業務設計 在數字化浪潮的推動下&#xff0c;連鎖店零售支付結算的設計愈發重要。一個優秀的支付結算設計不僅能夠提升用戶體驗&#xff0c;還能增強品牌競爭力&#xff0c;進而促進銷售增長。 本文將圍繞一個具體的連鎖店零售支付結算案例&#xf…

數據結構第06節:棧

棧&#xff08;Stack&#xff09;是一種后進先出&#xff08;Last In First Out, LIFO&#xff09;的數據結構&#xff0c;它只允許在一端&#xff0c;稱為棧頂&#xff08;Top&#xff09;&#xff0c;進行添加&#xff08;Push&#xff09;和移除&#xff08;Pop&#xff09;…

MySql Innodb 索引有哪些與詳解

概述 對于MYSQL的INNODB存儲引擎的索引&#xff0c;大家是不陌生的&#xff0c;都能想到是 B樹結構&#xff0c;可以加速SQL查詢。但對于B樹索引&#xff0c;它到底“長”得什么樣子&#xff0c;它具體如何由一個個字節構成的&#xff0c;這些的基礎知識鮮有人深究。本篇文章從…

【Spring Boot】JPA 的查詢方式

JPA 的查詢方式 1.使用約定方法名2.用 JPQL 進行查詢3.用原生 SQL 進行查詢3.1 根據 ID 查詢用戶3.2 查詢所有用戶3.3 根據 email 查詢用戶3.4 根據 name 查詢用戶&#xff0c;并返回分頁對象 Page3.5 根據名字來修改 email 的值3.6 使用事務 4.用 Specifications 進行查詢5.用…

Mac視頻下載工具,兼容14系統,Downie 4軟件下載

Downie 4 是一款由James Application開發的視頻下載軟件&#xff0c;支持Mac操作系統。該軟件允許用戶從各種視頻網站上下載視頻內容&#xff0c;以便于在本地設備上觀看&#xff0c;無需依賴互聯網連接。自動下載&#xff1a;可以設置Downie 4自動下載指定網站上的視頻&#x…

當+=的時候,為什么會出現NaN?

問: var textToDisplay; // "testing"; textToDisplay "testing"; textToDisplay 1; var someNumber 1; var oneMoreNumber; oneMoreNumber textToDisplay someNumber; //results in NaN console.log(oneMoreNumber); 這里的結果是NaN? 回答: 是…

【LinuxC語言】線程池的原理和實現

文章目錄 前言為什么需要線程池線程池的原理總結前言 在現代計算中,多線程編程已經成為一種常見的做法,它可以幫助我們更有效地利用多核處理器的能力。然而,頻繁地創建和銷毀線程會帶來一定的開銷。為了解決這個問題,我們可以使用一種稱為“線程池”的技術。線程池是一種在…

黑馬點評-Redis的緩存擊穿,緩存雪崩,緩存穿透,互斥鎖,邏輯過期

文章目錄 1.緩存穿透2.緩存雪崩3.緩存擊穿3.1 互斥鎖3.2 基于邏輯過期 1.緩存穿透 解決辦法 寫入NULL值到Redis緩存&#xff0c;以后就會命中Redis的控制緩存而不會出現請求直接打到數據庫的問題&#xff01; 代碼 2.緩存雪崩 這個概念很好理解&#xff0c;雪崩就是無數的…

【LLM大模型書】從零開始大模型開發與微調:基于PyTorch與ChatGLM (附PDF)

今天又來給大家推薦一本大模型方面的書籍<從零開始大模型開發與微調&#xff1a;基于PyTorch與ChatGLM>。 本書使用PyTorch 2.0作為學習大模型的基本框架&#xff0c;以ChatGLM為例詳細講解大模型的基本理論、算法、程序實現、應用實戰以及微調技術&#xff0c;為讀者揭…

設備樹在Linux系統的屬性

設備樹源文件 設備樹源文件擴展名為.dts&#xff0c;我們在前面移植 Linux 的時候卻一直在使用.dtb 文件&#xff0c;那么 DTS 和 DTB 這兩個文件是什么關系呢&#xff1f; DTS 是設備樹源碼文件&#xff0c; DTB 是將 DTS 編譯以后得到的二進制文件。將.dts 編譯為.dtb 需要什…

【微信小程序開發實戰項目】——如何制作一個屬于自己的花店微信小程序(2)

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;開發者-曼億點 &#x1f468;?&#x1f4bb; hallo 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 曼億點 原創 &#x1f468;?&#x1f4bb; 收錄于專欄&#xff1a…

FreeRTOS和UCOS操作系統使用筆記

FreeRTOS使用示例 UCOS使用示例 信號量使用 信號量訪問共享資源區/ OS_SEMMY_SEM; //定義一個信號量&#xff0c;用于訪問共享資源OSSemCreate ((OS_SEM* )&MY_SEM, //創建信號量&#xff0c;指向信號量(CPU_CHAR* )"MY_SEM", //信號量名字(OS_SEM_CTR )1, …

軟件模型分類及特點

在軟件開發的世界里&#xff0c;我們經常會遇到業務模型、系統模型和軟件模型這三個層次。這些模型各有特點&#xff0c;相互之間也有著緊密的聯系。通過理解這三個層次之間的映射關系&#xff0c;我們能更好地理解和掌握軟件開發的全過程 1. 業務模型 業務模型描述了組織的業…

政務單位網站SSL證書選擇策略

在數字化快速發展的今天&#xff0c;政務單位網站作為政府與公眾溝通的重要橋梁&#xff0c;其安全性和可信度顯得尤為重要。SSL證書作為保障網站安全的重要手段&#xff0c;其選擇對于政務單位網站來說至關重要。本文將探討政務單位網站在選擇SSL證書時應該考慮的因素&#xf…

如何使用python網絡爬蟲批量獲取公共資源數據教程?

原文鏈接&#xff1a;如何使用python網絡爬蟲批量獲取公共資源數據教程&#xff1f;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608240&idx4&snef281f66727afabfaae2066c6e92f792&chksmfa826657cdf5ef41571115328a09b9d34367d8b11415d5a5781dc4c…

【AI提升】如何使用大模型:本機離線和FastAPI服務調用

大模型本身提供的功能&#xff0c;類似于windows中的一個exe小工具&#xff0c;我們可以本機離線調用然后完成具體的功能&#xff0c;但是別的機器需要訪問這個exe是不可行的。常見的做法就是用web容器封裝起來&#xff0c;提供一個http接口&#xff0c;然后接口在后端調用這個…