当前位置: 首页 > 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;然后将菜单和餐盘交给专门制…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...