C语言:static关键字的使用

news2024/11/17 2:35:40

1.static修饰局部变量

这是static关键字使用最多的情况。我们知道局部变量是在程序运行阶段在栈上创建的,但是static修饰的局部变量是在程序编译阶段在代码段(静态区)创建的。所以在static修饰的变量所在函数执行结束后该变量依然存在。

//代码1
#include <stdio.h>
void test()
{
    int i = 0;
    i++;
    printf("%d ", i);
}
int main()
{
    int i = 0;
    for(i=0; i<10; i++)
    {
        test();
    }
    return 0;
}
//代码2
#include <stdio.h>
void test()
{
    static int i = 0;
    i++;
    printf("%d ", i);
}
int main()
{
    int i = 0;
    for(i=0; i<10; i++)
    {
        test();
    }
    return 0;
}

我们可以比较一下上面两段代码的运行结果,很容易发现代码1中的i每次打印的值都相同,代码2中的i每次打印的值都是之前的值加上1,所以代码1中的i每次都会在test函数运行结束时被销毁,而代码2中的i不会被销毁。

需要注意的是:static int i=0这句代码作用于程序编译阶段,而程序运行阶段这句代码是不会产生任何效果的。为了验证这一点,我们可以进行如下操作:

  1. 使用这样的代码
    #include<stdio.h>
    int main()
    {
    	int j = 0;
    	static int i = 0;
    	return 0;
    }
  2. 进入调试模式
  3. 反汇编 这就是这段代码的汇编代码了,下面对这段汇编代码进行讲解

 因为这条语句无汇编代码,所以程序运行过程中直接无视这条语句。该语句作用于程序编译阶段,编译阶段在运行阶段之前,也就是说静态局部变量i在程序编译阶段就创建好了,在整个程序运行结束之后才会被销毁。所以,static关键字延长了局部变量的生命周期。

2.static修饰全局变量

同样的,经过static修饰的全局变量和局部变量一样,在程序编译阶段就会被分配内存

未经过static修饰的全局变量具有外部链接属性,使用extern关键字即可以跨文件使用

//代码1
//add.c
int g_val = 2018;
//test.c
int main()
{
  extern int g_val;
  printf("%d\n", g_val);
  return 0;
}


//代码2
//add.c
static int g_val = 2018;
//test.c
int main()
{
  extern int g_val;
  printf("%d\n", g_val);
  return 0;
}

运行这两段代码,我们发现代码1正常,代码2在编译的时候会出现连接性错误。;

所以,经static修饰的全局变量的生命周期不变,作用域变小,只能够在本源文件内使用 

延申: 在使用extern声明外部变量时不能设定初始值,但是可以在声明之后单独给该变量赋值。

3.static修饰函数

和static修饰全局变量十分类似,经过static修饰的函数的外部链接属性也被限制了,即只能在本源文件使用

//代码1
//add.c
int Add(int x, int y)
{
  return x+y;
}
//test.c
int main()
{
  printf("%d\n", Add(2, 3));
  return 0;
}


//代码2
//add.c
static int Add(int x, int y)
{
  return x+y;
}
//test.c
int main()
{
  printf("%d\n", Add(2, 3));
  return 0;
}

运行两段代码,我们发现代码1正常,代码2在编译的时候会出现连接性错误。

所以,一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++(17):标准库特殊设施

tuple 类型 tuple是类似pair的模板。 每个pair的成员类型都不相同&#xff0c;但每个 pair都恰好有两个成员。不同tuple类型的成员类型也不相同&#xff0c;但一个tuple可以有任意数量的成员。 每个确定的tuple类型的成员数目是固定的&#xff0c;但一个tuple类型的成员数目可…

OS 死锁处理

如果P先申请mutex 则mutex从1置零&#xff0c;假设申请到的empty 0则empty变成-1阻塞态 同理C中mutex从0变为-1&#xff0c;那么如果想离开阻塞态&#xff0c;那么就需要执行V&#xff08;empty&#xff09;但是如果执行V&#xff08;empty&#xff09;就需要P&#xff08;mu…

postgresql-窗口函数

postgresql-窗口函数 简介窗口函数的定义分区选项&#xff08;PARTITION BY&#xff09;排序选项&#xff08;ORDER BY&#xff09;窗口选项&#xff08;frame_clause&#xff09; 聚合窗口函数排名窗口函数演示了 CUME_DIST 和 NTILE 函数 取值窗口函数 简介 常见的聚合函数&…

飞致云开源社区月度动态报告(2023年8月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…

开讲啦!0基础也能玩转飞桨开源社区

作为cs/ai学生&#xff0c;你是否经历过这些至暗时刻&#xff1a; 希望快速入门深度学习&#xff0c;无奈网上到处都是看不懂“黑话”一遍遍计算综测小数点后四位&#xff0c;不断在保研边缘反复横跳看着“洁白如新”的履历叹气&#xff0c;一听到“考研复试”就头皮发麻“0实习…

【ES6】Promise.allSettled的用法

Promise.allSettled() 是一个Promise方法&#xff0c;用于处理一个Promise数组&#xff0c;返回一个新的Promise数组&#xff0c;每个元素对应原始Promise的状态。这个方法可以用于处理多个异步操作&#xff0c;并且能够获取每个操作的结果和状态。 下面是Promise.allSettled(…

基于蛇优化算法优化的BP神经网络(预测应用) - 附代码

基于蛇优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于蛇优化算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.蛇优化优化BP神经网络2.1 BP神经网络参数设置2.2 蛇优化算法应用 4.测试结果&#xff1a;5.Matlab代…

ChatGPT~Error1015You are being rate limited

目录 问题背景 问题的原因 下来说说解决方案 总结 问题背景 今天使用Chatgpt的时候突然出现"You are being rate limited"的错误提示。 问题的原因 小问题了&#xff0c;又不是第一次被弄出来了&#xff0c;莫慌。 让我们先看看Chatgpt自己是怎么解释这个问题…

GE Diary 0001

今天是入职GEHC的第一天&#xff0c;虽然是OD岗位&#xff0c;但是员工氛围暂时没感觉有什么差异&#xff0c;领导也很随和。 公司印象&#xff1a;GEHC目前给我的印象是典型的外企&#xff1a;朝九晚五、无需打卡&#xff08;OD岗位需要打本公司的卡&#xff09;、短小精悍的会…

2781. 最长合法子字符串的长度

2781. 最长合法子字符串的长度 C代码&#xff1a;滑动窗口、哈希表 typedef struct{char* str;UT_hash_handle hh; } HashTable;HashTable* head;void AddToHash(char* str) {HashTable* out (HashTable*)malloc(sizeof(HashTable));out->str str;HASH_ADD_STR(head, str…

Opencv基于文字检测去图片水印

做了一个简单的去水印功能&#xff0c;基于文字检测去图片水印。效果如下&#xff1a; 插件功能代码参考如下&#xff1a; using namespace cv::dnn; TextDetectionModel_DB *textDetector0; void getTextDetector() {if(textDetector)return;String modelPath "text_de…

C++ 学习系列 -- const 关键字

C 中引入了 const 关键字&#xff0c;被 const 关键字修饰的变量其值不能修改&#xff0c;是只读的。 一 const 变量的初始化与存储 1. const 变量初始化时就需要赋初值&#xff0c;否则无法编译通过 二 const 与指针 指针常量&#xff1a; 指针所指向的值不可改变&…

Mysql数据库(2)—事务和锁

一、事务 数据库事务的特性&#xff1f; 数据库事务的四大特性是ACID。 原子性&#xff1a;就是所有操作要么全不做&#xff0c;要不全做。通过undo日志来实现。一致性&#xff1a;就是在并发情况下数据库由一个状态转移到另一个状态的数据要一致。通过事务的隔离级别来实现…

查询优化器内核剖析第一篇

SQL Server 的查询优化器是一个基于成本的优化器。它为一个给定的查询分析出很多的候 选的查询计划&#xff0c;并且估算每个候选计划的成本&#xff0c;从而选择一个成本最低的计划进行执行。实际上&#xff0c; 因为查询优化器不可能对每一个产生的候选计划进行优化&#xff…

2023-8-31 spfa求最短路

题目链接&#xff1a;spfa求最短路 #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 100010;int n, m; int h[N], w[N], e[N], ne[N], idx;int dist[N]; bool st[N];void add(int a…

360勒索病毒:了解最新变种.360,以及如何保护您的数据

引言&#xff1a; 近年来&#xff0c;网络安全威胁不断演变&#xff0c; 360 勒索病毒作为其中的一种恶意软件&#xff0c;已经对许多个人和组织的数据造成了巨大的损失。本文91数据恢复将介绍 360 勒索病毒的特点&#xff0c;探讨恢复被其加密的数据的方法&#xff0c;并分享一…

ctfshow 红包题

前言&#xff1a; 最近一直在搞java很少刷题&#xff0c;看见ctfshow的活动赶紧来复现一波~ ctfshow 红包挑战7 <?php highlight_file(__FILE__); error_reporting(2); extract($_GET); ini_set($name,$value); system("ls ".filter($_GET[1])."" )…

重要变更 | Hugging Face Hub 的 Git 操作不再支持使用密码验证

在 Hugging Face&#xff0c;我们一直致力于提升服务安全性&#xff0c;因此&#xff0c;我们将修改 Hugging Face Hub 的 Git 交互认证方式。 从 2023 年 10 月 1 日 开始&#xff0c;我们将不再接受密码作为命令行 Git 操作的认证方式。我们推荐使用更安全的认证方法&#xf…

敏感接口权限校验

前端校验 &#xff08;从前端或者从token里面拿一下&#xff09;&#xff0c;看一下用户有没有这个页面的权限&#xff08;但是一般不用&#xff0c;因为nodejs也可以写后端&#xff0c;但是放到前端去校验不安全&#xff09; 后端校验 需要梳理敏感数据接口&#xff0c;将这…

R语言图形的组合( par(),layout(),par(fig()) )

引入d.class进行画图 > d.class<-read.csv("D://class.csv",header T) > attach(d.class) > opar<-par(no.readonly TRUE)非常简单的数据&#xff0c;需要可自取 链接&#xff1a;https://pan.baidu.com/s/1zNx5z9JsaaRqFueRgGY3mQ 提取码&#x…