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

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...