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

 

 🔥个人主页:北辰水墨

🔥专栏: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.mzph.cn/bicheng/7528.shtml

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

相关文章

探索AI编程新纪元:从零开始的智能编程之旅

提示:Baidu Comate 智能编码助手是基于文心大模型,打造的新一代编码辅助工具 文章目录 前言AI编程概述:未来已来场景需求:从简单到复杂,无所不包体验步骤:我的AI编程初探试用感受:双刃剑下的深思…

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测 目录 分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测分类效果基本介绍程序设计参考资料分类效果 基本介绍 MATLAB实现LSSVM最小二乘支持向量机多分类预测。最小二乘支持向量机(Least Squares Support Vecto…

容器内存使用率(container_memory_working_set_bytes)高问题排查

背景 五一节假日值班期间,告警群里突然告警容器内存使用率高于 90%,并且后续一直有告警出现。随即登入指标监控系统查看该告警指标,如下: 该指标是通过 container_memory_working_set_bytes / container_spec_memory_limit_bytes…

44 网络基础

本章重点 了解网络发展背景,对局域网/广域网的概念有基本认识 了解网络协议的意义,重点理解TCP/IP五层结构模型 学习网络传输的基本流程,理解封装和分用 目录 1.网络发展 2.协议 3.OSI七层模型 4.TCP/IP五层模型 5.网络传输流程图 6.网络中…

WRT1900ACS搭建openwrt服务器小记

参考链接 wrt1900acs openwrt wrt1900acs openwrt 刷机 wrt1900acs原生固件刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-factory.img wrt1900acs openwrt更新刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-sysupgrade.bin 通过WEB UI来…

【数据结构】带你轻松掌握算法的复杂度

引入: 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累。我…

Spring Gateway的核心功能:路由、过滤、限流一网打尽

Spring Gateway的简介 在微服务架构的世界里,如同繁星点点的服务需要一个指挥家,将它们有序地组织起来,让它们能够和谐地协同工作。这个指挥家,就是Spring Gateway。它是一个基于Spring Framework 5、Project Reactor和Spring Bo…

『 Linux 』基础IO/文件IO (万字)

文章目录 🦄 什么是IO🦄 文件IO(库级别)👾 文件的打开与关闭👾 当前路径👾 文件的读写 🦄 标准输入输出流🦄 文件IO(系统级别)👾 文件的打开👾 文件的关闭👾 …

【微积分】微分方程的求解(必看)

文章目录 微分方程1.一阶微分方程1.1 可分离变量型微分方程1.2 一阶齐次微分方程1.3 一阶线性微分方程 2. 高阶微分方程2.1 可降阶的高阶微分方程求解(以二阶为例)2.2 二阶常系数线性微分方程2.2.1 二阶常系数齐次微分方程2.2.2 二阶常系数非齐次微分方程…

【操作指南】银河麒麟高级服务器操作系统内核升级——基于4.19.90-17升级

1. 升级清单 升级包及依赖包清单如下。 kernel ARM架构 kernel-core-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-extra-4.19.90-23.18.v2101.ky10.aarch64.r…

ASV1000视频监控平台:接入支持JT808标准的设备

目录 一、JT/T 808标准简介 (一)概述 (二)标准内容简介 1、消息分类 2、位置信息 3、报警信息 4、车辆控制 5、数据转发 二、在ASV1000上通过JT808添加设备 (一)登录视频监控平台管理端 &#x…

Coze扣子开发指南:怎样建立一个工作流?

Coze扣子的工作流支持通过可视化的方式,对插件、大语言模型、代码块等功能进行组合,从而实现复杂、稳定的业务流程编排。​ 简单的说,目前阶段,单独靠大语言模型能完成的任务还是有限的,那怎么办呢?解决方案…

电机控制系列模块解析(17)—— 速度环

一、电机转速控制 电机控制的速度环是整个电机控制系统中的外环,其主要任务是根据设定的转速指令值(目标速度)与实际电机转速之间的偏差,调整电流环的参考值(d轴电流Id或q轴电流Iq,涉及类似单电流环的弱磁…

抖音主播/电商人员有福了,利用Suno创作产品宣传,让产品动起来-小米Su7 - 第510篇

历史文章 AI音乐,8大变现方式——Suno:音乐版的ChatGPT - 第505篇 日赚800,利用淘宝/闲鱼进行AI音乐售卖实操 - 第506篇 如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 - 第507篇 导读 现在不管是淘宝电商,还是抖音电商&a…

借助Aspose.SVG图像控件,在线将 PNG 转换为 Base64 字符串

Aspose.SVG for .NET 是用于SVG文件处理的灵活库,并且与其规范完全兼容。API可以轻松加载,保存和转换SVG文件,以及通过其文档对象模型(DOM)读取和遍历文件的元素。API独立于任何其他软件,使开发人员无需使用…

第10篇:创建Nios II工程之控制单个七段数码管

Q:还记得之前使用Verilog case语句来描述实现七段数码管的逻辑功能。本期我们创建Nios II工程用C语言代码实现相同的功能。 A:基本原理:一个七段数码管由7个发光二极管LED组成,所以控制一个数码管的显示即控制7个LED。我们在之前…

手把手教你上手开源性能监控神器Arthas

前言 在日常的工作中,对于商业项目尤其是并发量较高的项目,系统在一些情况下会莫名其妙把CPU打满并且导致服务宕机,虽然90%的情况下,是迭代发版的代码有bug,但是既然有这个情况,线上出现事故了&#xff0c…

海外大带宽服务器的带宽大小是如何定义的?

海外大带宽服务器的带宽大小通常是由提供的数据传输速率来衡量的。Rak部落小编为您整理发布海外大带宽服务器的带宽大小是如何定义的? 带宽的大小决定了服务器能够处理的数据量和传输速度,这对于确保服务器性能至关重要。在详细定义中,带宽可以根据以下…

对C语言符号的一些冷门知识运用的剖析和总结

符号 目录* 符号 注释 - 奇怪的注释 - C风格的注释无法嵌套 - 一些特殊的注释 - 注释的规则建议 反斜杠’’ - 反斜杠有续行的作用,但要注意续行后不能添加空格 * 回车也能起到换行的作用,那续行符的意义在哪? - 反斜杠的转义功能 单引号…

公钥私钥?一文搞懂非对称加密

非对称加密 非对称加密: 通信双方分别创建公钥和私钥,并且保证公钥所加密的信息,只有配对的私钥可以解密,接下来,双方公开交换公钥,通信时,使用对方的公钥进行加密,如此&#xff0…