【C/C++】内存分布

本文第一部分主要介绍了程序内存区域的划分以及数据的存储。第二部分有一段代码和一些题目,全面直观得分析了程序中的数组在内存中的存储。


因为不同的数据有不同的存储需求,各区域满足不同的需求,所以程序内存会有区域的划分。

根据需求的不同,数据一般可以分为

  1. 临时使用的数据 存放在栈帧中
  2. 动态使用的数据(数据结构中经常使用到,算法中通常需要动态开辟一些空间)
  3. 整个程序期间都会使用到的数据  静态变量
  4. 不修改的制度数据  常量,可执行代码

根据存储功能的不同C/C++内存区域通常可以划分为

  1.   又叫堆栈,用于存放非静态局部变量/函数参数/返回值等,栈是向下增长的。
  2.   用于程序运行时动态内存分配,堆是可以向上增长的,malloc,calloc,realloc在这里面开空间,但是指向这些空间的指针存放在栈上。
  3. 数据段  一般被称为静态区,存储全局数据和静态数据。
  4. 代码段  一般被称为常量区,存放可执行代码和只读常量。

阅读以下代码回答下列问题,答案在代码下方。

  1. globalVar 和 staticGlobalVal 有什么不同?
  2. staticGlobalVal 和 staticVal 的生命周期一样吗?
  3. 设有选项A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)  ①globalVar ②staticGlobalVar ③staticVar ④localVar ⑤num1 ⑥char2 ⑦*char2 ⑧pChar3 ⑨*pChar3 ⑩ptr1 ⑪*ptr1分别存放在ABCD哪个区域中?
  4. ①sizeof(num1) ②sizeof(char2) ③sizeof(pChar3) ④sizeof(ptr1) ⑤strlen(char2) ⑥stren(pChar3) 的值分别为多少?
  5. sizeof 和 strlen 的区别是什么?
  6. pChar3 可以修改吗?
int globalVar = 1;static int staticGlobalVar = 1; void Test() 
{ static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd";const char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof(int) * 4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); free(ptr1); free(ptr3); 
} 

重要!!!!

1.它们的链接属性不同,非静态全局变量可以在当前源程序下的各个源文件里使用,而静态的全局变量只在被定义的源文件中使用

2.它们都是静态变量,生命周期是相同的,是整个源程序,但是在函数中被定义的静态变量只能在该函数中使用,退出函数后它们虽然还存在但不能使用。

3. CCCAAAAADAB ①gobalVar 全局变量存放在静态区 ②staticGlobalVar 静态全局变量存放在静态区 ③staticVar 静态变量存放在静态区 ④localVar 普通变量存放在栈 ⑤num1 数组存放在栈  ⑥char2 字符数组存放在栈 ⑦*char2 指向字符数组的指针,指针存放在栈上 ⑧pChar3  指针,存放在栈上 ⑨*pChar3 指针指向的是一串常量字符串(因为前面有const修饰)所以存放在代码段也就是常量区 ⑩ptr1 指针,存放在栈区 ⑪*ptr 指针指向的这块区域是动态开辟的空间,是存放在堆上的

4.①40 数组中存放了10个int的数据,大小为4*10 ②5 sizeof要算上'\0' ③4or8 指针的大小就是4或8,取决于编译器 ④4or8 ⑤4 strlen的计算是不加上'\0'的 ⑥4

5.sizeof是操作符,strlen是函数,sizeof计算时会加上'\0',strlen计算字符串长度时'\0'不计入

6.pChar3是可以修改的,因为const在*前,修饰的是指针所指向的内容,指针可以被修改,如果const在*后,修饰的是指针本身,这时指针才不能被修改。


-The End-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/325525.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【活动】如何通过AI技术提升内容生产的效率与质量

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 如何通过AI技术提升内容生产的效率与质量引言一、自然语言处理(NLP&…

Java设计模式 _结构型模式_外观模式

一、外观模式 1、外观模式 外观模式(Facade Pattern)是一种结构型模式。主要特点为隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这有助于降低系统的复杂性,提高可维护性。当客户端与多个子系统之间存在大量…

Golang | Leetcode Golang题解之第78题子集

题目: 题解: func subsets(nums []int) (ans [][]int) {set : []int{}var dfs func(int)dfs func(cur int) {if cur len(nums) {ans append(ans, append([]int(nil), set...))return}set append(set, nums[cur])dfs(cur 1)set set[:len(set)-1]df…

SpringAMQP Work Queue 工作队列

消息模型: 代码模拟: 相较于之前的基础队列,该队列新增了消费者 不再是一个,所以我们通过代码模拟出两个consumer消费者。在原来的消费者类里写两个方法 其中消费者1效率高 消费者2效率低 RabbitListener(queues "simple.queue")public voi…

Java设计模式-工厂

Java设计模式中,工厂模式主要包括普通工厂模式以及抽象工厂模式,普通工厂模式是用于制造输出不同类型的对象,抽象工厂模式是用于制造输出不同类型的普通工厂,本文主要描述工厂模式的基本用法。 如上所示,使用普通工厂模…

某票星球网图标点选验证码YOLOV8识别案例

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 图标点选验证码大家都不陌生了,我们来看下数据集 引言与个人想法 先说结论,本文采用的方法能够达到99的准确率,效果图如下 做图标点选其实方法有很多,有的…

鸿蒙 @builder 使用中的问题

在所有条件都相同的情况下,点击左边的 list更新右侧的list 方案一 使用builder ,右侧 list不会更新 方案二 直接写 list UI,右侧list会更新 所以,builder中的数据,无法双向绑定么 BuildergetTreeItemLayout(currentL…

智慧法治:AI技术如何赋能法律行业创新

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

环形链表(给定一个链表的头节点 head ,返回链表开始入环的第一个节点)的原理讲解

一:题目 二:原理讲解 解决这个题目 ,我们得先理解它的原理。 1: 首先假设两个指针,一个快指针fast,一个慢指针slow,fast一次移动两个节点,slow一次移动一个节点。(前面…

全学科知网普刊征稿中!即日提交,月内即可见刊!

在当前的学术环境下,论文发表的压力日益增大。当您需要评职称、申请学位、结项课题或完成其他有期限的学术要求时,快速发表普刊能够确保您及时满足这些需求,提升您的职业竞争力,为您的职业发展需求打下坚实基础。 我处普刊现积极…

操作系统基础之磁盘

概述 基本概念 磁盘有正反两个盘面,每个盘面有多个同心圆,每个同心圆是一个磁道,每个同心圆又被划分为多个扇区,数据就被存在扇区中。 磁头首先寻找到对应磁道,然后等到磁盘进行周期旋转到指定的扇区,才…

Word应用:一键提取手写签名

1、将带有签名的图片插入到word文档中,裁剪出签名部分; 2、点击“格式-颜色”,选择“重新着色”中的“黑白50%”; 3、“格式-颜色”,设置透明色; 4、选择“文件”选项卡,选择打开“选项”,点击“…

STM32学习计划

前言: 这里先记录下STM32的学习计划。 2024/05/08 今天我正在学习的是正点原子的I.MX6ULL APLHA/Mini 开发板的 Linux 之ARM裸机第二期开发的视频教程,会用正点原子的I.MX6ULL开发板学习第二期ARM裸机开发的教程,然后是学习完正点原子的I.M…

国产操作系统下使用dpkg命令管理软件包 _ 统信 _ 麒麟 _ 中科方德

往期好文:国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello,大家好啊!在Linux系统中,dpkg是Debian包管理系统的基础命令工具,它允许用户安装、卸载、查询和管理软件包。在国产操作系统如统信UOS和麒麟KOS、中科方…

wsl2安装rancher并导入和创建k8s集群

环境准备 安装wsl2点击此文]ubuntu20.04安装docker 点击此文,安装完成后docker镜像仓库改成阿里云镜像加速地址.如果不熟请点击此文 docker 安装rancher 启动wsl,根据官方文档以root身份执行 sudo docker run -d --restartunless-stopped -p 80:80 -p 443:443 --privileged …

[单片机课设]十字路口交通灯的设计

题目要求: 模拟交通灯运行情况。南北绿灯亮30秒,南北黄灯亮3秒,东西红灯亮33秒;南北红灯亮33秒,东西绿灯亮30秒,东西黄灯亮3秒;要求数码管同步显示时间的倒计时,用定时器实现延时。…

Array.map解析

map方法会创建一个新数组。该方法会循环数组中的每个值,如果仅仅是想循环数组不需要返回值使用数组的forEach方法就可以。原数组中的每个元素都调用一次提供的函数后的返回值组成。Array.map 它接收一个函数 这个函数可以接收三个参数 数组的每个值item 这个值的索引…

docker容器实现https访问

前言: 【云原生】docker容器实现https访问_docker ssl访问-CSDN博客 一术语介绍 ①key 私钥 明文--自己生成(genrsa ) ②csr 公钥 由私钥生成 ③crt 证书 公钥 签名(自签名或者由CA签名) ④证书&#xf…

C#中实现DataGridView数据的优雅Excel之旅(EPPlus)

DataGridView效果图: EXCEL效果图: 代码如下: 首先要引入EPPlus包 可以使用命令行来安装 Install-Package EPPlus 也可以使用NUGet搜索EPPlus来安装 public Homes(){InitializeComponent();ExcelPackage.LicenseContext OfficeOpenXml.LicenseContext…

Git克隆仓库报错:HTTP/2 stream 1 was not closed

报错及原因 fatal: unable to access ‘https://github.com/xxx/’: HTTP/2 stream 1 was not closed cleanly before end of the underlying stream http/2 和 http/1.1之间有个区别是“HTTP2 基于 SPDY,专注于性能,最大的一个目标是在用户和网站间只…