static的理论学习

在说到static之前,需要先明确变量类型:
而在聊到变量类型之前我们可以将变量的两个属性好好学一学

变量的两个属性

作用域(scope):

从内存的角度来看,就是变量存放在栈(stack)中,还是 数据段中(Data Segment),那么stack和Data segment又有什么区别呢?

链接性(linkage)

分为外部链接性(external linkage)和内部链接性(internal linkage),从函数的角度来看,就是函数能访问到的变量范围。

存储区

栈(stack

存储临时数据,例如内部变量(局部变量)和返回地址;
在下述的四种变量类型中,有且只有内部变量是存储在栈中。

数据段(Data Segment

数据段是全局变量和静态变量存放的主要区域,还可能包括程序的只读数据(如字符串常量)。数据段是程序的只读部分,用于存储程序的全局变量和静态变量。
在程序的整个执行期间,数据段保持不变。

变量类型:

外部变量(External Variable):

也称为全局变量(Global Variable)。
它们在程序的整个运行期间都是可见的,并且可以在程序的任何部分被访问。
外部变量具有外部链接性,这意味着它们可以在多个编译单元(如多个源文件)中共享。

内部变量(Internal Variable):

又称局部变量,它们只在定义它们的块(例如函数或代码块)内部可见。
内部变量具有内部链接性,这意味着它们不能在定义它们的块之外访问。

静态外部变量(Static External Variable):

当你在函数或代码块之外声明一个变量,并使用static关键字时,它就变成了静态外部变量。
静态外部变量具有静态存储期,即它们在程序的整个生命周期内都存在,但它们只在定义它们的编译单元中可见。
即使具有外部链接性,使用static关键字也会限制其可见性到定义它们的文件内。

静态内部变量(Static Internal Variable):

这是在函数内部声明的静态变量。
与自动存储期的局部变量不同,静态内部变量在函数调用结束后不会消失,它们的值在下一次函数调用时仍然保持。
静态内部变量只在定义它们的函数内可见。

分析static

可以看到有了static这个关键字(key word),外部变量就会被限制链接性,内部变量就会更改它的作用域,从而扩大了它的生命周期(LifeTime),而且在一个文件编译(汇编)的时候,只会赋一次初值,这个待会会看到。

1.8示例

示例代码

#include <stdio.h>

int fun() {
    static int a = 0; 
    return (++a);
}

int main(void) {
    printf("a = %d\n", fun());
    printf("a = %d\n", fun());
    return 0;
}
问1:该示例代码输出是什么?
答1:

在这里插入图片描述

问2:如果fun()中的static int a = 0;去掉static,输出又是什么呢?
答2:

在这里插入图片描述

问3:为什么static修饰的变量在返回值时会出现不同的情况?

我们先来看一下他们的各自的汇编的不同之处吧:、
有static的示例
在这里插入图片描述
无static的示例
在这里插入图片描述

答3:static声明的内部变量,在链接性上仍然是局部的(local),然而在作用域却变成comm,说明a在作用域上变成了全局变量,数据存储在了data segment中。

注:诸位站友如有所收获不如点个免费的赞,如有错误之处或有其它补充的点,请在评论区发表你的观点,看到必回。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Open3D SVD算法实现对应点集配准

目录 一、概述 1.1基本思想 1.2实现步骤 二、代码实现 三、实现效果 3.1原始点云 3.2配准后点云 3.3变换矩阵 一、概述 在点云配准中,SVD(Singular Value Decomposition,奇异值分解)方法是一种常用的精确计算旋转和平移变换的算法。其目标是找到一个刚体变…

解答|企业网站为什么首选OV SSL证书

在数字化转型日益加速的今天&#xff0c;企业网站不仅承载着品牌形象展示、产品服务介绍、客户互动沟通等多重功能&#xff0c;更是企业与客户建立信任桥梁的关键所在。然而&#xff0c;在网络空间中&#xff0c;数据安全与隐私保护成为不容忽视的核心议题。SSL证书作为加密通信…

在 PostgreSQL 里如何实现数据的自动清理和过期处理?

文章目录 一、使用 TIMESTAMP 列和定期任务二、使用事件触发器&#xff08;Event Triggers&#xff09;三、使用分区表&#xff08;Partitioned Tables&#xff09;四、结合存储过程和定时任务示例场景实现步骤测试与验证 在 PostgreSQL 中&#xff0c;可以通过多种方式实现数据…

Spring系统学习 - AOP之基于注解的AOP和XML的AOP

上一篇我们围绕了AOP中代理模式的使用&#xff0c;这篇我们将主要围绕AOP的相关术语介绍&#xff0c;以及重点围绕基于注解的AOP进行相关知识的概述和使用说明。 AOP的相关术语 切面&#xff08;Aspect&#xff09;&#xff1a;切面是一个模块化的横切关注点&#xff0c;它包含…

mybatis-plus参数绑定异常

前言 最近要搞个发票保存的需求&#xff0c;当发票数据有id时说明是发票已经保存只需更新发票数据即可&#xff0c;没有id时说明没有发票数据需要新增发票&#xff1b;于是将原有的发票提交接口改造了下&#xff0c;将调用mybatis-plus的save方法改为saveOrUpdate方法&#xff…

C++:多态(继承)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;多态》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :maple_leaf:多态的概念:maple_leaf:继承中的多态1.:leaves:虚函数表 :…

更亮更好听的户外耳机,下班之后畅快运动,哈氪聆光体验

在当今市场上&#xff0c;蓝牙耳机种类繁多&#xff0c;现在正值酷热的夏季&#xff0c;有必要准备一副适合户外活动的蓝牙耳机&#xff0c;对此&#xff0c;我觉得气传导耳机更适合在户外锻炼或散步时使用。这种耳机设计通常为后挂式&#xff0c;不仅佩戴舒适&#xff0c;而且…

宝塔面板运行Admin.net框架

准备 宝塔安装 .netcore安装 Admin.net框架发布 宝塔面板设置 完结撒花 1.准备 服务器/虚拟机一台 系统Windows server / Ubuntu20.04&#xff08;本贴使用的是Ubuntu20.04版本系统&#xff09; Admin.net开发框架 先安装好服务器系统&#xff0c;这里就不做安装过程描述了&…

安装nodejs | npm报错

nodejs安装步骤: 官网&#xff1a;https://nodejs.org/en/ 在官网下载nodejs: 双击下载下来的msi安装包&#xff0c;一直点next&#xff0c;我选的安装目录是默认的: 测试是否安装成功&#xff1a; 输入cmd打开命令提示符&#xff0c;输入node -v可以看到版本&#xff0c;说…

“郑商企航”暑期社会实践赴美丽美艳直播基地开展调研

马常旭文化传媒网讯&#xff08;记者张明辉报道&#xff09;导读&#xff1a;2024 年 7 月 3 日&#xff0c;商学院暑期社会实践团“郑商企航”在河南省郑州市新密市岳村镇美丽美艳直播基地&#xff0c;展开了一场意义非凡的考察活动&#xff0c;团队成员深度调研了直播基地的产…

DMA方式的知识点笔记

苏泽 “弃工从研”的路上很孤独&#xff0c;于是我记下了些许笔记相伴&#xff0c;希望能够帮助到大家 目录 1. DMA基本概念 2. DMA传送过程 易错点 DMA控制器操作流程 3. DMA传送方式 这是单总线的结果 &#xff08;CPU说了算 所以不会产生于CPU的冲突&#xff09; 这…

idea创建dynamic web project

由于网课老师用的是eclipse,所以又得自己找教程了…… 解决方案&#xff1a; https://blog.csdn.net/Awt_FuDongLai/article/details/115523552

仕考网:公务员体检对视力有要求吗?

公务员招聘过程中的体检标准对视力有具体要求&#xff0c;根据不同的岗位职责有所差异。通常情况下&#xff0c;如果申请者双眼经过矫正后视力均低于4.8(小数视力0.6)&#xff0c;则会被视为不合格。 对于某些特殊岗位&#xff0c;如J察等&#xff0c;单侧裸眼视力若低于4.8也…

【教程】Github Page 添加自定义域名

目录 前言购买域名验证自定义域名映射自定义域名记录类型注意点参考 前言 Github Page 是 Github 提供的一个可以从 Github 仓库上托管静态网站的功能服务。默认当你建立起一个仓库后&#xff0c;在对应会有一个可供浏览的静态网站&#xff0c;例如 https://eternaldeath.gith…

【动态规划Ⅵ】背包问题 /// 组合问题

背包问题 什么是背包问题0-1背包问题分数背包完全背包问题重复背包问题 背包问题例题416. 分割等和子集474. 一和零 完全平方数279. 完全平方数322. 零钱兑换 排列与组合组合&#xff0c;无重复&#xff1a;518. 零钱兑换 II排列&#xff0c;可重复&#xff1a;377. 组合总和 Ⅳ…

MySQL架构优化及SQL优化

变更项目的整体架构是性能收益最大的方式。主要涉及两方面&#xff0c;一方面是从整个项目角度&#xff0c;引入一些中间件优化整体性能&#xff0c;另一方面是调整MySQL的部署架构&#xff0c;确保能承载更大的流量访问&#xff0c;提高数据层的整体吞吐。 1. 引入缓存中间件…

语义分割和实例分割区别?

语义分割&#xff1a;将图像中的每个像素分配给其对应的语义类别&#xff0c;其主要针对于像素&#xff0c;或者说它是像素级别的图像分割方法。&#xff1a;语义分割的目的是为了从像素级别理解图像的内容&#xff0c;并为图像中的每个像素分配一个对象类。 实例分割&#xf…

泛微E9开发 控制Radio框字段打印是否仅显示选中项文字

控制Radio框字段打印是否仅显示选中项文字 1、需求说明2、实现方法3、扩展知识点控制Radio框字段打印是否仅显示选中项文字格式参数说明样例 1、需求说明 当我们对单选框进行打印时&#xff0c;往往会把所有的选项一起打印出来&#xff08;如下图所示&#xff09;&#xff0c;现…

【1】A-Frame整体介绍

1.A-Frame是什么&#xff1f; A-Frame 是一个用于构建虚拟现实 (VR) 体验的 Web 框架。 A-Frame 基于 HTML 之上&#xff0c;因此上手简单。但 A-Frame 不仅仅是 3D 场景图或标记语言&#xff1b;它还是一种标记语言。其核心是一个强大的实体组件框架&#xff0c;为 Three.js …

昇思MindSpore学习入门-模型模块自定义

基础用法示例 神经网络模型由各种层(Layer)构成&#xff0c;MindSpore提供构造神经网络层的基础单元Cell&#xff0c;基于Cell进行神经网络封装。下面使用Cell构造经典模型AlexNet。 如图所示&#xff0c;AlexNet由5个卷积层与3个全连接层串联构成&#xff0c;我们使用mindspo…