当前位置: 首页 > news >正文

存储类别、链接与内存管理(一)

1、一些必要的基础概念

(1)对象

  • 从硬件的角度,被存储的每个值都被占用了一定的物理内存,C语言把这样的一块内存称为对象
  • 对象可以存储一个或多个值
  • 一个对象可能并未存储实际的值,也可能存储一个或多个值,但是在存储是适当的值时一定具有相应的大小
  • 要注意的是,面向对象编程语言(例如C++)的“对象”指的是“类对象”不是本章讨论的“对象”,其定义包括数据和允许对数据的操作

(2)标识符

int entity = 3;
int* pt = &entity;
int ranks[10];
  • 标识符是一个名称,用来指定特定对象的内容。例如上面的声明创建了一个标识符entity,entity即是C语言指向硬件内存中的对象的方式
  • 但是变量名不是对象的唯一途径,比如pt整体不是一个标识符,但是可以通过pt来指向一个对象

(3)左值

  • 指定对象的表达式被成为“左值”,提到左值意味着:
    • ①它指定一个对象,可以引用内存中的地址
    • ②它可以出现在赋值运算符的左侧
  • entity是标识符也是左值;*pt是表达式也是左值;
  • ranks+2*entity不是标识符,也不是左值;*(ranks+2*entity)是表达式,也是左值
  • 可修改左值:后来新增了const修饰符,const修饰的变量不可修改,满足第一点但不满足第二点。一方面C语言继续把某些标识对象的表达式定义为左值,另外一方面某些左值不能放在赋值运算符的左侧,因此多了一个细分概念,即“可修改的左值”,当前标准建议用术语“对象定位值”更好

(4)翻译单元和文件

  • 我们认为的多个文件可能会在编译器中以一个文件的形式出现。比如通常在.c文件中,会使用大量的.h文件,头文件还有可能包含其他的.h文件,C预处理器实际上是用包含的头文件内容替换掉#include指令。所以编译器把源文件代码和多个头文件看成是一个包含信息的单独文件,这个文件就叫做“翻译单元”
  • 如果程序由多个源代码构成,那么程序也应该由多个翻译单元,每个翻译单元对应一个源代码文件和它所包含的头文件

2、对“对象”和“标识符”的描述

(1)可以用“存储期”描述对象

存储期:描述通过这些标识符访问对象的生存期

静态存储期,一个变量如果具有静态存储期,那么它在程序的执行期间会一直存在。文件作用域变量就具有静态存储期(无论其是内部还是外部属性)注意注意,对于文件作用域变量,关键字static不是指改变成静态(因为本来就具有静态变量),而是改变其链接
线程存储期,线程存储期多用于并发程序开发,程序执行被分为多个线程。具有线程存储期的对象,从声明到线程结束的时候一直都存在。以关键字_Thread_local声明一个对象时,每个线程都可以获得该变量的私有备份
自动存储期,块作用域的变量通常具有自动存储期。当程序进入定义这些变量的块时,为这些变量分配内存,当退出这个块时,释放刚才为变量分配的内存。这种做法相当于把自动变量占用的内存视为一个可以重复使用的工作区或暂存区。不过变长数组略有不同,它们的存储器从声明处到块的末尾。所有使用的局部变量默认都是自动类别。要想要局部变量具有静态存储期,可以在声明前加上关键字static使其具有静态存储期

void more(int number)
{    int index;static int ct = 0;    //某些代码    return 0;
}

变量ct存储在静态内存中,它从程序中被载入到程序结束期间都存在,但是,他的作用域在块内,只有在使函数more时,才可以直接使用ct访问它指向的对象(但是可以让more函数提供该存储区的地址以便于间接访问该对象)
动态分配存储期,这个涉及到动态分配内存,比较复杂,暂时不讨论

(2)可以用“作用域”和“链接”描述标识符

作用域:描述程序中可以访问标识符的区域

块作用域,主要体现在{}内和函数的形参

void function(void)
{int j = 100;{int j = 10;printf("%d", j);for(int i = 0; i < 10; i++){    printf("%d", i);}}printf("%d", j);
}

变量i只有在最内层{}才可以被使用,j在第二层{}可以被使用(注意j此时值为10而不是100),最外层j的值为100。另外for循环里的i虽然不在最内层{}里,但是也是属于最内存的,具有块作用域,这种特性包括if、while、do等
函数作用域,主要体现在用于goto的标签,这意味着即使goto的标签首次出现在函数的内层块中,它的作用域也是延申到整个函数,这就避免了在一个函数中使用同名标签的情况,避免了混乱
函数原型作用域,主要是用于函数原型中的形参名,范围是从形参定义处到原型声明结束。这就意味着编译器在处理函数原型中的形式参数时只关心它的类型,形参名字通常无关紧要。即使在函数声明中有形参名,也不必与函数定义中的形参相同。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
只有在带有变长数组参数的函数中,形参名才有用void function(int n, int m, arr[n][m]);

文件作用域,文件作用域变量通常也叫做全局变量,“文件”的意义就在于:具有文件作用域的变量,从它的定义处到该文件到定义所在文件的结尾都可以被使用

int units = 100;
void function(void);
int main()
{//某些代码return 0;
}
void function(void)
{//某些代码
}

其中units就是全局变量,具有文件作用域,units从定义开始可以到文件结尾全都可见

链接:描述如何处理在不同文件中出现的标识符

外部链接,具有文件作用域的变量可以是外部链接和内部链接,默认情况下全局变量具有外部链接属性,在其他文件需要这个变量时,要用extern提醒编译器这是一个外部变量
内部链接,具有文件作用域的变量可以是外部链接和内部链接,可以通过static修饰变量来改变成内部链接,只给一个文件私有
无链接,具有块作用域、函数作用域、函数原型作用域的变量都是无链接变量(这很符合“黑盒”这个说话)

3、c语言的存储类别

C提供了很多的存储类
在这里插入图片描述

4、参考来源

来自书籍《C primer puls》第12章的“存储类别、链接和内存管理”章节

相关文章:

存储类别、链接与内存管理(一)

1、一些必要的基础概念 &#xff08;1&#xff09;对象 从硬件的角度&#xff0c;被存储的每个值都被占用了一定的物理内存&#xff0c;C语言把这样的一块内存称为对象对象可以存储一个或多个值一个对象可能并未存储实际的值&#xff0c;也可能存储一个或多个值&#xff0c;但…...

JS设计模式

文章目录1 什么是设计模式&#xff1f;2 发布-订阅模式2.1 DOM事件2.2 基于Broadcast Channel实现跨页面通信2.3 基于localStorage实现跨页面通信2.4 使用 Vue 的 EventBus 进行跨组件通信2.4 使用 React 的 EventEmitter 进行跨组件通信3 装饰器模式3.1 React 高阶组件 HOC3.2…...

四、常用样式讲解二

文章目录一、常用样式讲解二1.1 元素隐藏1.2 二级菜单1.3 相对定位和绝对定位1.4 定位的特殊情况1.5 表格1.6 表格的css属性1.7 表格中新增的标签一、常用样式讲解二 1.1 元素隐藏 如何让一个元素隐藏 1、不定义颜色 占用空间 2、display: none 不占用空间 3、visibility: hi…...

KDHX-8700无线高压核相相序表

一、产品简介 KDHX-8700无线高压核相相序表&#xff08;以下简称“仪器”&#xff09;用于测定三相线相序、检测环网或双电源电力网闭环点断路器两侧电源是否同相。在闭环两电源之前一定要进行核相操作&#xff0c;否则可能发生短路。仪器适用于380V&#xff5e;35kV交流输电线…...

【C++提高笔记】泛型编程与STL技术

文章目录模板的概念函数模板函数模板语法函数模板注意事项函数模板案例普通函数与函数模板的调用规则模板的局限性类模板类模板语法类模板与函数模板区别类模板中成员函数创建时机类模板对象做函数参数类模板与继承类模板成员函数类外实现类模板分文件编写类模板与友元类模板案…...

实用机器学习-学习笔记

文章目录9.1模型调参9.1.1思考与总结9.1.2 基线baseline9.1.3SGD ADAM9.1.4 训练代价9.1.5 AUTOML9.1.6 要多次调参管理9.1.7复现实验的困难9.1模型调参 9.1.1思考与总结 1了解了baseline和调参基本原则 2了解了adams和sgd的优劣 3了解了训练树和神经网络的基本代价 4了解了a…...

2023-02-15 学习记录--React-邂逅Redux(二)

React-邂逅Redux&#xff08;二&#xff09; “天道酬勤&#xff0c;与君共勉”——承接React-邂逅Redux&#xff08;一&#xff09;&#xff0c;让我们一起继续探索Redux的奥秘吧~☺️ 一、前言 React-邂逅Redux&#xff08;一&#xff09;让我们对Redux有了初步认识&#xff…...

Framework——【MessageQueue】消息队列

定义 队列是 Apache RocketMQ 中消息存储和传输的实际容器&#xff0c;也是 Apache RocketMQ 消息的最小存储单元。 Apache RocketMQ 的所有主题都是由多个队列组成&#xff0c;以此实现队列数量的水平拆分和队列内部的流式存储。 队列的主要作用如下&#xff1a; 存储顺序性…...

SpringBoot依赖原理分析及配置文件

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot依赖原理分析及配置文件 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4…...

智慧机场,或将成为航空领域数字孪生技术得完美应用

在《智慧民航建设路线图》文件中&#xff0c;民航局明确指出&#xff0c;智慧机场是实现智慧民航的四个核心抓手之一。这一战略性举措旨在推进数字化技术与航空产业的深度融合&#xff0c;为旅客提供更加智能化、便捷化、安全化的出行服务&#xff0c;进一步提升我国民航发展的…...

SQL64 对顾客ID和日期排序

描述有Orders表cust_idorder_numorder_dateandyaaaa2021-01-01 00:00:00andybbbb2021-01-01 12:00:00bobcccc2021-01-10 12:00:00dickdddd2021-01-11 00:00:00【问题】编写 SQL 语句&#xff0c;从 Orders 表中检索顾客 ID&#xff08;cust_id&#xff09;和订单号&#xff08;…...

MybatisPlus使用聚合函数

前言 今天遇到了一个求总数返回的情况&#xff0c;我一想这不是用sum就完事了吗。 但是仔细想想&#xff0c;MybatisPlus好像没有直接使用sum的api。 虽然没有直接提供&#xff0c;但是办法还是有的&#xff0c;下面就分享下如何实现的&#xff1a; 首先如果使用sql是这么写…...

工程管理系统源码企业工程管理系统简介

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…...

《计算机视觉和图像处理简介 - 中英双语版》:使用 OpenCV对图像进行空间滤波

文章大纲 Linear Filtering 线性滤波器Filtering Noise 过滤噪声Gaussian Blur 高斯滤波Image Sharpening 图像锐化Edges 边缘滤波Median 中值滤波Threshold Function Parameters 阈值函数参数References本文大概需要40分钟 Spatial Operations in Image Processing 图像处理中…...

FreeRTOS软件定时器 | FreeRTOS十三

目录 说明&#xff1a; 一、定时器简介 1.1、定时器 1.2、软件定时器 1.3、硬件定时器 1.4、FreeRTOS软件定时器 1.5、软件定时器服务任务作用 1.6、软件定时器的命令队列 1.7、软件定时器相关配置 1.8、单次定时器和周期定时器 1.9、软件定时器结构体 二、软件定时…...

电脑文件被误删?360文件恢复工具,免费的文件恢复软件

电脑里面保存着各种文件&#xff0c;因为误操作我们把还需要用的文件给删除了。很多人都想要使用不收费的文件恢复软件来进行恢复操作&#xff0c;但是又不清楚有哪些文件可以帮到我们。接下来就给大家介绍&#xff0c;一款真正免费的数据 恢复app&#xff0c;一起来看看&#…...

pg_cron优化案例--terminate pg_cron launcher可自动拉起

场景 在PostgreSQL中我们可以使用pg_cron来实现数据库定时任务 我有一个select 1的定时任务&#xff0c;每分钟触发一次 testdb# select * from cron.job ;jobid | schedule | command | nodename | nodeport | database | username | active | jobname -------…...

Python 之 NumPy 随机函数和常用函数

文章目录一、随机函数1. numpy.random.rand(d0,d1,…,dn)2. numpy.random.randn(d0,d1,…,dn)3. numpy.random.normal()4. numpy.random.randint()5. numpy.random.sample6. 随机种子np.random.seed()7. 正态分布 numpy.random.normal二、数组的其他函数1. numpy.resize()2. nu…...

【目标检测】K-means和K-means++计算anchors结果比较(附完整代码,全网最详细的手把手教程)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 一、介绍 YOLO系列目标检测算法中基于anchor的模型还是比较多的,例如YOLOv3、YOLOv4、YOLOv5等,我们可以随机初始化a…...

Java高手速成 | 图说重定向与转发

我们先回顾一下Servlet的工作原理&#xff0c;Servlet的工作原理跟小猪同学食堂就餐的过程很类似。小猪同学点了烤鸡腿&#xff08;要奥尔良风味的&#xff09;&#xff0c;食堂窗口的服务员记下了菜单&#xff0c;想了想后厨的所有厨师&#xff0c;然后将菜单和餐盘交给专门制…...

告别付费困扰:Linux与Windows双平台免费获取Typora全攻略

1. Typora收费后的免费替代方案 Typora作为一款广受欢迎的Markdown编辑器&#xff0c;突然宣布收费让很多用户措手不及。作为一名长期使用Typora的技术写作者&#xff0c;我完全理解大家的心情。好消息是&#xff0c;我们完全可以在不违反软件许可协议的前提下&#xff0c;继续…...

基于SendBird SDK的iOS即时通讯应用架构与最佳实践详解

1. 项目概述&#xff1a;一个iOS即时通讯的“样板间”如果你正在为你的iOS应用寻找一个功能完整、架构清晰的即时通讯&#xff08;IM&#xff09;功能实现参考&#xff0c;那么sendbird/sendbird-chat-sample-ios这个GitHub仓库绝对值得你花上半天时间好好研究。它不是一个简单…...

ArcGIS标注进阶:手把手教你搞定分式标注和河流左斜体(附完整表达式)

ArcGIS标注进阶&#xff1a;分式标注与河流左斜体实战指南 在地图制图领域&#xff0c;专业标注是提升可视化效果的关键环节。许多GIS工程师在进行水文地质制图时&#xff0c;常遇到分式标注格式混乱、河流名称无法实现标准左斜体等痛点问题。本文将彻底解决这些标注难题&#…...

芯片原型开发实战指南:从虚拟原型到FPGA的决策与调试

1. 原型决策前的核心考量&#xff1a;一份来自一线的深度清单在硬件和系统设计领域&#xff0c;原型开发是连接构想与现实的桥梁&#xff0c;但这座桥怎么搭、用什么材料、何时能通车&#xff0c;每一步都充满了抉择。很多团队在项目启动时&#xff0c;满腔热情地喊着“先做个原…...

【AI 越强越离不开工具】:2026 年大模型开发者必备的工具链全景实战(附代码 + 架构图)

前言 目录 前言 一、核心悖论&#xff1a;为什么 AI 越强大&#xff0c;反而越依赖工具&#xff1f; 二、核心拆解&#xff1a;从 Tool 到 Skill 到 Agent&#xff0c;工具链的三层进化逻辑 三、2026 年 AI 工具链全景架构图 四、四大核心工具模块实战&#xff08;附可直…...

Exception Error

Exception 分为两类&#xff1a;运行时异常&#xff08;非受检异常&#xff09;继承自 RuntimeException&#xff0c; 编译器不强制处理&#xff0c;多为代码逻辑错误导致。常见例子&#xff1a; NullPointerException&#xff08;空指针异常&#xff09; ArrayIndexOutOfBound…...

AI应用治理平台ZLAR:从网关到统一架构的演进与实践

1. 项目概述&#xff1a;从单一工具到统一平台的演进最近在折腾AI应用开发&#xff0c;特别是涉及到多模型调用、安全审计和策略执行这块&#xff0c;发现很多开源项目都是“各自为政”。比如&#xff0c;你需要一个网关来管理AI模型的访问&#xff0c;又需要一个独立的日志系统…...

如何快速将STL转换为STEP:5个高效转换技巧指南

如何快速将STL转换为STEP&#xff1a;5个高效转换技巧指南 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp STL到STEP格式转换是3D设计和工程制造领域的关键桥梁&#xff0c;而stltostp正是解决…...

Firefly:一站式大模型训练工具,从零到一掌握LLM微调

1. 项目概述&#xff1a;一站式大模型训练工具Firefly 如果你正在寻找一个能够让你快速上手&#xff0c;从零开始训练或微调主流大语言模型&#xff08;LLM&#xff09;的开源项目&#xff0c;那么Firefly&#xff08;流萤&#xff09;绝对值得你花时间深入了解。作为一名在AI…...

Docker 学习笔记:镜像分发、容器运行与资源限制

Docker 学习笔记&#xff1a;镜像分发、容器运行与资源限制本笔记续接上一部分&#xff0c;涵盖镜像命名与分发、容器的核心操作、底层技术&#xff08;cgroup/namespace&#xff09;以及 CPU/内存资源限制。所有案例代码均经验证&#xff0c;直接可用。8. 镜像命名与分发最佳实…...