【C语言】static关键字的妙用

前言

在c/c++中存在着一种内存结构,以此为栈区、堆区、静态区(这里是大致划分,不细究)

存放规则如下:

栈区:存放局部变量、函数的形参、临时属性的变量

堆区:存放malloc、realloc、calloc、free等函数用于动态内存管理使用

静态区:存放全局变量、静态变量 

 

 一、static修饰局部变量

 我们试着运行以下代码,可以得知结果为1 1 1 1 1

 因为在函数test()的内部创建的 i 是具有临时属性的变量,其存放在内存的栈区,i 的作用域为函数test()的内部,生命周期为出作用域就结束,故每次进入test都会重新创建 i。

那如果我们用static修饰以下会发生什么呢?

 我们会发现,结果成了1 2 3 4 5,这是为什么呢?

这里我们就不得不说一下static关键字对局部变量的作用了,我们看一下它们对应的汇编代码

我们可以发现,经过static修饰的局部变量 i 的创建过程是没有经过汇编代码的,也就是说static使变量 i 加长了生命周期,注意:只是加长了生命周期,并没有扩大作用域

 二、static修饰全局变量

很明显,当我们把全局变量 i 定义在add.c文件中时,test.c文件中的 i 是无法被识别的,此时我们可以使用extern关键字, 它可以用来声明外部符号。

 这样就可以运行了,但当我们再使用static修饰全局变量 i 时,编译器再次报错:

 这是因为:C语言规定,全局变量具有外部连接属性,这种属性可以使全局变量在多个文件中互相使用,而static使全局变量的外部连接属性转变成了内部链接属性,即缩小了全局变量的作用域

三、static修饰函数 

static修饰函数与static修饰全局变量类似,函数在被引用之后是可以在其他文件中使用的,即也拥有外部连接属性,但被static修饰后,函数将被局限在自身所在文件中,不可被外部使用。

总结:static修饰局部变量可以改变局部变量的生命周期,不改变作用域,修饰全局变量和函数时均是改变的是链接属性,即可理解为锁在所在文件,不允许别的文件访问。

其实这样可以防止别人使用自己定义的变量。

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

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

相关文章

2024 年适用于 Mac 的 5 大最佳免费数据恢复工具

一个常见的误解是,数据恢复总是很昂贵。实际上,您可以在 2024 年下载许多适用于 Mac 的免费数据恢复软件工具,并使用它们来恢复丢失的数据,而无需将 Mac 交给数据恢复专业人员,他们保证会向您收取一小笔费用他们的服务…

Ansys Mechanical|中远程点的Behavior该如何设置?

Remote point是ANSYS mechanical中的一种常见节点自由度耦合建模形式,在转动装配体中的连接转动副、或者在施加远端约束及远端载荷的时候,我们经常用到远端单元来耦合一个面或者一条线。例如销轴似的滚动摩擦连接,如果我们希望将两个物体通过…

Linux ps命令详细参数

一、简介 在Linux系统中,ps(Process Status的缩写)命令常常用来用来列出系统中当前运行的进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。要对进程…

【动态规划】子序列问题II|最长定差子序列|最长的斐波那契数列的长度|最长等差数列|等差数列的划分

一、最长定差子序列 1218. 最长定差子序列 算法原理: 💡细节: 1.正常创建dp表,分析状态转移方程:可能b存在于多个不同的位置,那么要用哪个下标的dp呢? 用最后一个b的,因为用前面的可…

springboot3.0+继续使用springboot2.0配置会显示 `无法自动装配,找不到对应的Bean`解决方法

在 Spring Boot 3.0 中,Spring 团队对自动配置机制进行了重大变更,特别是 spring.factories 文件。spring.factories 文件已被 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件所取代。在springboot3.0继续使用…

Danfoss丹佛斯S90泵比例放大器

S90R042、S90R055、S90R075、S90R100、S90R130、S90R180、S90R250电气排量控制变量泵比例阀放大器,电气排量控制为高增益控制方式:通过微小变化的输入电流控制信号即可推动伺服阀主阀芯至全开口位置,进而将最大流量的控制油引入到伺服油缸。伺…

搭建Prometheus+grafana监控系统

1. 项目目标 (1)熟练部署安装node_exporter (2)熟练部署安装prometheus (3)熟练部署安装grafana 2. 项目准备 2.1. 规划节点 主机名 主机IP 节点规划 prometheus-server 10.0.1.10 server prome…

光伏运维系统在光伏电站的应用

摘要:全球化经济社会的快速发展,加快了传统能源的消耗,导致能源日益短缺,与此同时还带来了严重的环境污染。因此,利用没有环境污染的太阳能进行光伏发电获得了社会的普遍关注。本文根据传统式光伏电站行业的发展背景及其监控系统的技术设备,给出了现代化光伏电站数据…

手机IP地址:固定还是动态?探寻背后的变化之谜

在数字化时代的今天,手机作为我们日常生活中必不可少的通讯工具,扮演着越来越重要的角色。其中,IP地址作为手机在网络世界中的“身份证”,对于手机的正常运作至关重要。然而,很多人对于手机IP地址的固定性存在疑问&…

电子合同怎么盖章的

数字证书盖章:利用个人或企业的数字证书进行盖章。数字证书作为数字身份证明,确保了电子签名和盖章的可信度。通过加密技术,确保合同内容不被篡改,盖章过程完成后,合同具有法律效力。 时间戳盖章:在电子合…

【AI绘画】Stable diffusion初级教程08——提示词(prompt)该如何写

今天是一篇干货,干的喝水的那种…… 写之前呢,先给大家打个比方:现在刚入门学习SD的相当于刚上学的小学生,提示词就相当于作文,还是英语作文,如果你总是抄抄抄,不知道作文的要点,语法…

实验10 协作图

一、实验目的 通过绘制活协作图,掌握协作图的基本原理。能对简单问题进行协作图的分析与绘制。 二、实验项目内容(实验题目) 考试成绩管理系统是举行成人高考、自学考试等成人高校对每个参与考试的学员成绩进行综合管理的一个系统。本系统的…

redis7基础篇2 redis的3种模式(主从,哨兵,集群)模式

一 主从复制模式 1.1 主从模式 主从模式: 主机可以读,写,重机只能写操作。 主机shutdown后,从机上位还是原地待命:从机不动,原地待命,数据正常使用,等待主机重启归来。 主机shu…

输入法变了 输入的地方由原来的一条线变成了小白方块,打完字后还会把原来的字覆盖掉

今天工作是,不知道不小心点了什么按键后,输入法变了, 输入的地方由原来的一条线变成了小白方块,打完字后还会把原来的字覆盖掉 之前都是,重启解决这个问题的,今天不想重启了,重启后打开工作用的…

在Linux上面部署ELK

注明:一下的软件需要自己准备 一、准备环境: 1.两台elasticsearch主机4G内存 2.两台elasticsearch配置主机名node1和node2(可以省略) #vim /etc/hostname #reboot 3. 两台elasticsearch配置hosts文件 #vim /etc/hosts 192.168.1.1 node1 192…

OpenCompass大模型离线测评

一、目录 环境配置环境测试本地模型测评 二、实现 环境配置 >>创建环境 conda create --name opencompass python3.10 pytorch torchvision pytorch-cuda -c nvidia -c pytorch -ysource activate opencompass git clone https://github.com/open-compass/opencompas…

第 8 章 机器人底盘Arduino端PID控制(自学二刷笔记)

重要参考: 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.4.5 底盘实现_04Arduino端PID控制 上一节最后测试时,电机可能会出现抖动、顿挫的现象&#xff…

力扣HOT100 - 62. 不同路径

解题思路&#xff1a; 动态规划 注意要初始化第一行和第一列的值 class Solution {public int uniquePaths(int m, int n) {int[][] dp new int[m][n];for (int i 0; i < m; i) {dp[i][0] 1;}for (int j 0; j < n; j) {dp[0][j] 1;}for (int i 1; i < m; i) {…

快手截流多功能协议引流多线程多账号使用

在市场上&#xff0c;类似的软件售价都在几千元&#xff0c;但我发现这款全新版本的软件已经更新&#xff0c;而且我只需要配合使用谷歌浏览器&#xff0c;稍微调慢一点延时&#xff0c;我就可以像专业人士一样流畅地进行操作。 评论对于我而言是一种艺术&#xff0c;而不仅仅是…