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.mzph.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;然后接口在后端调用这个…