深入了解C/C++的内存区域划分

news2024/11/24 19:07:13

 

 🔥个人主页:北辰水墨

🔥专栏:C++学习仓

Alt

本节我们来讲解C/C++的内存区域划分,文末会附加一道题目来检验成果(有参考答案)

一、大体有哪些区域?分别存放什么变量开辟的空间?

栈区:局部变量,函数的参数

堆区:动态分配的内存

静态区:静态变量,全局变量

常量区:数字常量,字符串常量

代码区:被编译后的程序代码(二进制代码)

 

二、各个区域的特性:

栈区:

    在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元会自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存空间有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。

堆区:

    堆区一般存储的是动态内存如由malloc,calloc,realloc动态开辟的空间。这些空间一般由程序员分配释放,若不释放,程序结束时可能由OS回收,但若程序没有结束,则会造成内存泄漏,因此动态开辟的空间一定要记得free释放。内存分配的方式类似于链表。

静态区:

   (static)存放全局变量、静态数据。程序结束后(不是函数结束)由系统释放。

常量区:

     存放数字常量,字符串常量。

代码区:

      被编译后的程序代码(二进制代码)。

三、如何区分变量开辟的空间是那个区域?

在它定义的时候:

    1.是局部变量还是全局变量。

    2.有没有static关键字。

    3.有没有malloc函数在堆区空间开辟空间。

    4.是不是常量。

 

四、区分变量和变量名:

      上面提到的变量(下面的题目我也是直接叫变量了):开辟的空间存在哪个区域

      变量名:存储在编译器的内存中,而不是程序运行时的五大区域中。

      编译器会根据程序中定义的变量、函数和其他标识符的信息构建符号表,并将其保存在内存

中以便后续的编译和链接操作使用。

      符号表:在编译连接时,会通过这个符号表将相应的变量名,函数名都映射成对应的地址 

 

五、请听题!

int globalvar = 1;
int staticGlobalVar = 1;
int main()
{
	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));
	free(ptr1);
	free(ptr2);
	free(ptr3);
	return 0;
}

(1)选择题:

下面的变量在内存的哪个区域?

选项:A、栈区        B、堆区     C、静态区      D、常量区

①   globalvar___       staticGloalVar___     staticVar___         

②   localVar___     num1___

③   char2___       *char2___                           

④   pChar3___       *pChar3___

⑤   ptr1___          *ptr1___       

(2)答案:①  C   C   C   

           ②  A    A

           ③  A    A 

           ④  A    D

           ⑤  A    B

(3)解析:

①静态变量和全局变量 存放在 静态区

②局部变量 存放在 栈区。num1也是一个局部的变量(在栈区开辟了一块数组)

③char2是一个局部变量

  *char2解引用表示它指向的那一块数组的首元素,而数组的首元素存储在栈区中,这里你们一定有疑惑,为什么字符串存储在栈区。其实不然,这里表示的char类型的数组会在栈区开辟5个字节的空间,然后把在常量区的字符串“abcd\0”拷贝到数组中。

所以*char指向的数组是在栈区。

④pChar3也是一个局部变量,在栈区。

  *pChar3指向的是常量区的字符串“abcd\0”,所以*pChar3表示字符串的首元素a,a是存放在常量    区的。

⑤ptr1也是一个局部变量,存放在栈区。它指向的是一块堆区的内存块。

  *ptr1,是对ptr1指针解引用,就是堆区的那一块空间。

这么说你们肯定还是发蒙,那我画个图来带你们理解!、

138c70ac37a9452fb0c5401b386807f5.png

                   

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django高级表单处理与验证实战

title: Django高级表单处理与验证实战 date: 2024/5/6 20:47:15 updated: 2024/5/6 20:47:15 categories: 后端开发 tags: Django表单验证逻辑模板渲染安全措施表单测试重定向管理最佳实践 引言: 在Web应用开发中,表单是用户与应用之间进行交互的重要…

工厂模式+策略模式完成多种登录模式的实现

前提 (简单工厂不属于设计模式,而是一种编程思想【抽象一层出来】)工厂方法模式、抽象工厂模式 以上都是为了解耦,如果考虑多个纬度(如需要同时考虑多种电器,多种品牌)则优先考虑抽象工厂。 …

iMazing下载安装不了怎么办?

iMazing是一款可用于iPhone、iPad等ios移动设备管理软件,但需要注意的是,iMazing只能安装在Windows与Mac系统中,不能安装在iOS移动设备上。iOS移动设备可以通过USB线或Wi-Fi连接Windows或Mac系统上的iMazing软件。 iMazing的安装失败&#x…

Linux--IIC驱动编程实验

对于 I2C 主机驱动,一旦编写完成就不需要再做修改,其他的 I2C 设备直接调用主机驱动提供的 API 函数完成读写操作即可。这个正好符合 Linux 的驱动分离与分层的思想,因此 Linux内核也将 I2C 驱动分为两部分: ①、 I2C 总…

3.栈和队列(汇总版)

目录 1.栈(一端插和删) 2.队列(一端插另一段删) 2.1队列的概念及结构 2.2 队列的实现 队列的接口 1.初始化队列 2.销毁队列 3.插入元素 4.出队列(头删) 5.访问对头 6.访问队尾 7.判断队列是否为…

练习题(2024/5/6)

1路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], target…

【漏洞复现】某小日子太阳能系统DataCube3审计

漏洞描述 某小日子太阳能系统DataCube3终端测量系统 多个漏洞利用方式 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进…

一起了解开源自定义表单的优势表现

随着社会的进步和科技的发展,越来越多的中小企业希望采用更为先进的软件平台,助力企业实现高效率的流程化管理。低代码技术平台、开源自定义表单已经慢慢走入大众视野,成为一款灵活、高效的数字化转型工具。流辰信息专注于低代码技术平台的研…

GitOps介绍

基础设施即代码 IaC 在理解 GitOps 之前,需要先理解什么是基础设施即代码。 基础设施即代码(Infrastructure as Code,简称IaC)是一种软件工程实践,它将基础设施的管理和配置过程像管理代码一样进行版本控制、自动化和…

RabbitMQ是怎么做消息分发的?——Java全栈知识(14)

RabbitMQ是怎么做消息分发的? RabbitMQ 的消息分发分为五种模式:分别是简单模式、工作队列模式、发布订阅模式、路由模式、主题模式。 1、简单模式 publisher 直接发送消息到队列消费者监听并处理队列中的消息 简单模式是最基本的工作模式,…

C++:哈希表和unordered系列容器的封装

一、unordered系列关联式容器的介绍 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是&…

软件测试必问的33个面试题

1.你为什么选择软件测试行业 因为之前有了解软件测试这个行业,觉得他的发展前景很好。 2.根据你以前的工作经验描述一下软件开发、测试过程,由那些角色负责,你做什么 要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所…

软件公司为什么很少接二开项目?

前言 很多企业由于原有项目还在继续运营,但原有技术公司不想再合作或者不想再维持整个技术团队等原因,就需要找一个新的软件公司继续维护原有软件系统。但是一接触往往发现很多软件公司拒绝接手第三方的软件项目,这究竟是什么原因呢&#xff…

控制台调试 hover 后才出现的元素

调试 hover后才出现的元素 打开开发者工具,鼠标放在hover时才出现的元素上,然后点击右键; 不要选中任何选项,将鼠标移动到开发者工具的调试面板中; 按下N键,此时悬浮的元素不会消失,定位成功。…

Vue-组件中的data

一个组件的data选项必须是一个函数。保证每个组件实例,维护独立的一份数据对象。如下图: 组件一旦封装好了,可以使用多次,比如数字框组件使用了三次: 每次创建新的组件实例,都会重新执行一次data函数&#…

OCC笔记:图形可视化的实现方式

注:文中参看的occ的源码版本为7.4.0 1、实现思路概览 整体架构 主要有3大块:AIS(Application Interactive Services ,直译为:应用程序交互服务)、Graphics(图形)、Geometry & T…

Java面试题:多线程3

CAS Compare and Swap(比较再交换) 体现了一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性. 线程A和线程B对主内存中的变量c同时进行修改 在线程A中存在预期值a,修改后的更新值a1 在线程B中存在预期值b,修改后的更新值b1 当且仅当预期值和主内存中的变量值相等…

数据处理学习笔记9

一些其他的函数 “Resize”和“Reshape”的区别主要在于它们对数组元素数量和形状的处理方式不同,以下是详细介绍: “Resize”通常会改变数组的元素数量,在放大数组形状时会用0补全新增的元素,而在缩小数组形状时会丢弃多余的元素…

oracle 8i系统检查

oracle 8i系统检查 set echo on spool d:\bk\1.txt select sysdate from dual; --版本信息 select * from v$version; --安装的产品 col PARAMETER for a50; col value for a10; select * from v$option order by 2; --用户信息 set linesize 100 set pagesize 100 COL USE…

浅析扩散模型与图像生成【应用篇】(二十一)——DALLE·2

21. Hierarchical Text-Conditional Image Generation with CLIP Latents 该文提出一种基于层级式扩散模型的由文本生成图像的方法,也就是大名鼎鼎的DALLE2。在DALLE2之前呢,OpenAI团队已经推出了DALLE和GLIDE两个文生图模型了,其中DALLE是基…