static作用:静态变量的生存周期和作用域

2023-10-27

首先要理解生存周期与作用域的区别:
生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。
作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。

static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。可以认为static变量的作用域<=生存周期。

举一个局部声明的例子。在函数test中声明静态变量i:
void test()
{
int m=3;
static int i=5;
}
局部变量m存放在栈中,当test函数结束,m将被销毁;静态变量i不存放在栈中,而是存放于程序的全局变量区域,因此随着函数test的结束,它并不随着出栈操作而被销毁,它的生存周期存在于程序的整个运行期;然而m和i的作用域都仅存在于test函数中它们的定义之后,即test调用结束之后,m和i就不再可用,但是i仍存在于内存之中。

再举一个全局声明的例子。在文件A 中定义静态变量j:
int n=3; //默认为extern
static int j=5; //声明为static
全局变量和静态变量j都存放于程序的全局数据区域,它们的生存周期都是程序的整个运行期,但是n的作用域为全局作用域,可以通过extern在其他文件中使用,而j只能在文件A中使用,例如在文件B中:
extern int n; //ok
extern int j; //error: j在文件B中不可见
int a=n;//ok:但这里有个初始化先后的问题,具体参见参考一
int b=j;//error
也就是说,在声明全局的static变量时,static没有改变它的生存周期,也即存储位置(因为全局变量本来就存储在全局数据域),而是将变量的作用域限制在当前文件中。

中兴通讯2012校招笔试题的一道问答题:
1. static全局变量与普通的全局变量有什么区别 ?
 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
  全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
  这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
static全局变量只初使化一次,防止在其他文件单元中被引用;  
2. static局部变量和普通局部变量有什么区别 ?
  把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
  static局部变量只被初始化一次,下一次依据上一次结果值;  
3. static函数与普通函数有什么区别?
   static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

P.S.
C程序一直由下列部分组成:
1)正文段(代码段)——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;
2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。(这就是为什么全局内置类型变量会初始化,而局部变量就为未初始化的未知值)
4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
5)堆——动态存储分。
程序在内存中申请了代码段,全局数据段(初始化和未初始化),栈和堆:程序代码放于代码段,全局变量和静态变量存放在全局数据段中,一直存在直到程序结束,而局部变量都放于临时的栈中,随着作用域的结束随着出栈操作而销毁。malloc和new出来的内存不属于上面提到的程序申请的内存中,而是在系统中申请到的内存,所以如果在程序中没有明确free和delete的话,程序结束后该内存仍不会被释放,造成内存泄漏。例如:
int test()
{
int * p=new int(3);
}
则test函数结束后,p指针本身被销毁,因为它是存在于函数栈中的局部变量,而p指向的int整型内容仍存在于内容堆中,没有被释放,造成内存泄漏。
详细内存使用和参考http://blog.csdn.net/cc198877/article/details/8849694

参考
http://www.cnblogs.com/jerry19880126/archive/2013/03/09/2951186.html
http://www.cnblogs.com/jerry19880126/archive/2012/12/22/2829394.html
http://www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html
http://bbs.csdn.net/topics/350238100

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

static作用:静态变量的生存周期和作用域 的相关文章

  • Scrach基本概念与操作

    基本概念 一个程序最初的触发是由事件 黄色积木 负责的 例如点击播放事件 按下空格事件 当接收到消息等 程序由舞台和角色组成 舞台和角色都可以有多个 Scratch本身提供了许多舞台和角色的素材 可直接使用 每个角色都有自己的脚本代码 由各
  • Linux下c++遍历文件夹中文件及读取绝对路径

    文件读取等操作是程序编写的基础 因此在总结了网上多个博客的基础上 写出了如下读取文件及保存绝对路径的代码片段 整理出来供大家学习 注意 这里dirent h是只有在Linux下才有的 include
  • kotlin_基础_枚举和密封类(sealed class)

    转载自 https blog csdn net deng hui long article details 108173544 写这篇文章之前 做了很多调研 查阅了很多资料 文章也反复推敲打磨了很多遍 为什么我要去做这么多的调研工作 因为
  • Python入门学习01

    基础 输出 输出语句print print 输出语句 输出函数 1 在控制台输出一段文本信息 用一对英文双引号标记 print 文本信息 默认换行 2 print 文本信息 end 结尾 n 换行符 t 制表符 3 print 文本信息1
  • linux删除软件

    linux删除软件 删除软件但不删除配置文件 sudo apt get remove softname 同时删除软件包和配置文件 sudo apt get remove purge softname 删除无用依赖包 sudo apt get
  • samba Error NT_STATUS_CONNECTION_REFUSED Failed to connect with SMB1 -- no workgroup available

    连接同事的共享服务时报错 smbclient L ip U user WARNING The syslog option is deprecated Enter WORKGROUP administrator s password Shar
  • 解决Port 8080 is already in use

    前言 在运行项目的时候报错显示端口号已被占用 如下图 解决方法 第一步 win R打开 输入cmd进入命令窗口 第二步 输入netstat ano回车 找到对应的进程PID为14472 第三步 输入命令tasklist回车 找到对应的进程名
  • JQ开发中遇到的问题(一)

    目录 目录 1 收藏与取消收藏切换 2 使用layui插件下拉选择渲染问题 1 收藏与取消收藏切换 说明 从接口中获取收藏状态 单击切换状态 如下图所示 开始状态 点击后状态 代码实现 1 全局定义一个变量 记录状态 var collect
  • 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(一)

    第一章 自动化测试基础 第一节 软件测试分类 关于软件测试领域名词颇多 发现有许多测试新手混淆概念 从不同的角度可以将软件测试有不同的分类的方法 所以 这里汇总常见软件测试的相关名词 对软件测试领域有个概括的了解 根据项目流程阶段划分软件测
  • 4种GC方法+分代回收+触发GC情况+内存申请过程

    引用计数 对象增加一个引用时 引用数 1 减少一个时 引用数 1 当进行垃圾回收时 只回收引用数为0的对象 面对互相引用无解 方法比较老 基本弃用 标记 清除 从根节点遍历标记对象 然后遍历整个堆 清除没有标记的对象 缺点 运行效率不高 产
  • vsftpd主动模式和被动模式

    vsftpd主动模式和被动模式 主动模式 PORT 所谓主动模式 指的是FTP服务器主动去连接客户端的数据端口来传输数据 其过程具体来说就是 客户端从一个任意的非特权端口N N gt 1024 连接到FTP服务器的命令端口 即tcp 21端
  • 数据结构进阶(一)

    更多内容可以访问我的个人博客 1 二叉查找树 参考 深入学习理解二叉搜索树 附详细讲解与实例分析 1 1 基本概念 二叉查找树 也称二叉搜索树 或二叉排序树 其要么是一颗空树 要么就是具有如下性质的二叉树 1 若任意节点的左子树不空 则左子
  • Python安装教程步骤2:Windows中创建虚拟环境安装Pytorch并在PyCharm中配置虚拟环境

    python安装教程步骤2 windows中Anaconda创建虚拟环境安装pytorch并在pycharm中使用虚拟环境 作者介绍 windows中Anaconda创建虚拟环境安装pytorch 1 添加镜像源 2 创建虚拟环境 3 进入
  • 如何在CSDN中发布博客

    1 首先打开CSDN官网 进行注册然后登录 登录以后看到的界面如下 2 进入会员中心右边有个创作中心点进去 看到界面如下 3 在上界面中 可以单击 发布 直接写博客 如下所示 4 也可以单击 Markdown编辑器 或者 富文本编辑器 进入
  • Method的invoke方法初步了解

    Java调试过程中 我们有时候会需要对JVM运行过程中哪出了问题进行调试 先从最基础的了解 我们都知道Java框架中方法的调用基本上都是通过反射机制来实施的 具体流程如下 1 方法的调用先检查AccessibleObject的overrid
  • 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(九)

    整理不易 希望对各位学习软件测试能带来帮助 软件测试知识持续更新 第八章 自动化测试高级应用 第一节 自动发邮件功能 8 1 1 文件形式的邮件 8 1 2 HTML 形式的邮件 8 1 3 获取测试报告 8 1 4 整合自动发邮件功能 第
  • 数组里面对象去重的3种方法

    数组里面对象去重的方法挺多的 下面列了几种方法任君选择 下面是将要过滤的数据 将arr里面id重复的数据去掉 下面方法中用的arr都是这组数据哦 var arr id 1 name 周瑜1 id 3 name 王昭君1 id 2 name
  • ssh-keygen 常用命令与参数

    ssh keygen 常用命令与参数 生成密钥 默认生成 2048 位 RSA 密钥 ssh keygen 生成 4096 位 RSA 密钥 ssh keygen t rsa b 4096 生成 521 位 ECDSA 密钥 ssh key
  • 堆和栈的通俗解释【转】

    数据结构的栈和堆 首先在数据结构上要知道堆栈 尽管我们这么称呼它 但实际上堆栈是两种数据结构 堆和栈 堆和栈都是一种数据项按序排列的数据结构 栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧 它是一种具有后进先出性质的数据结构 也就是
  • fastjson 问题

    问题 1 fastjson value 为null key 会丢失问题 2 SerializerFeature 配置参数 背景 和第三方系统进行对接 两边商量好了接口定义 有些是非必填项 从数据库查询出来的数据赋值给相应的key 有些Str

随机推荐

  • js作用域

    一 js没有块级作用域 在c java等语言中花括号里的代码都有自己的作用域 而js花括号没有块级作用域 经常会导致一些困惑 不明所以 例如 console info color if true var color blue console
  • 数据源——信用评分的前世今生【附FICO分介绍】

    信用评分这把 看不见的标尺 如今已经逐渐渗透到我们生活的方方面面 大到贷款买房买车 小到租用一个共享充电宝 都受到它的影响 那么问题来了 这个重要的数字是从哪里冒出来的呢 这就要从信用评分的起源讲起 什么是信用评分 信用评分 Credit
  • Oracle 11g+PLSQL Developer安装及环境配置

    1 安装包 OracleXE112 Win64 zip 数据库服务管理平台 plsql 11 0 4 安装包 语言包 注册机 rar 第三方客户端 链接 https pan baidu com s 1AKTrd6Qu9 qk59N G6AV
  • cookie,token,ajax异步请求,知识点

    当get 或post 访问接口时 如果需要传入cookie 可以直接传入jar格式的cookie 也可以传入字典格式cookie cookie cookie是存储与访问者计算机的变量 由浏览器负责存储在电脑本地 一般加密存储 但是由于存储在
  • 软件审查工具

    代码审查工具 https baijiahao baidu com s id 1693720741656939513 wfr spider for pc Eclipse Code Review 代码审查 工具介绍 https www itey
  • 快速成长的秘诀|自我成长的方法有哪些?

    快速成长总共三篇 分别是 完成自我升级 自我成长的方法 学会自我培养或培养他人 在成长第一篇 完成自我升级 发布后 有很多同学做了仔细阅读 而且其中一位同学给了我非常好的反馈补充 他的原话 我看完了 给我一个最大的感受是 您把一整套认知思维
  • Vue动画的使用

    动画的作用 提高用户的体验 帮助用户更好的理解页面中的功能 使用过渡类名实现动画 动画进入 v enter 动画进入之前的初始状态 v enter to 动画进入之后的结束状态 v enter active 动画进入的时间段 PS 第一 第
  • KVM实战入门之Libvirt

    环境说明 本实验在VMware的centos6 7 x64进行的 1 VMware配置 如果不能勾上则不能继续进行 解决办法 重新创建VMware虚拟机 到这一步 自定义 能勾上了 创建虚拟机后即可下一步 2 查看Linux环境 查看是否支
  • HC32L110国产超低功耗华大MCU芯片介绍

    华大HC32L110 系列32 位 ARM Cortex M0 微控制器 HC32L110 系列是一款旨在延长便携式测量系统的电池使用寿命的超低功耗 Low Pin Count 宽电压工作范围的 MCU 集成 12 位 1M sps 高精度
  • VirtualBox+Windbg 进行双机调试的方法

    以前见他们调试驱动程序之类的都是使用的VMWare 我没怎么用这软件 感觉这软件有点臃肿 后台服务挂得太多了 感觉不爽 于是就没搞它 加上电脑上很早就装有Oracle的Virtual Box 于是就看了下 其实Virtual Box也有支持
  • 使用msf监听模块接收反弹shell

    Metasploit Framework MSF 提供了多种方式来监听反弹 shell 使用 multi handler 模块 这是 MSF 中最常用的模块之一 用于监听反弹 shell 它支持多个协议和 payload 可以根据需要进行配
  • SQL基础笔记

    Codecademy中Learn SQL SQL Table Transformaton和SQL Analyzing Business Metrics三门课程的笔记 以及补充的附加笔记 Codecademy的课程以SQLite编写 笔记中改
  • nginx反向代理后获取真实请求ip

    本来接口运行的好好的 后面为了规范接口 我在nginx加了如下代码 location v1 api proxy pass https xxx xxx xxx 8081 v1 api 后面重新部署后发现通过HttpServletRequest
  • python下载安装使用_下载、安装与使用 pysot

    本篇文章简要介绍了如何在windows环境下 使用anaconda进行pysot运行环境的部署以及使用 pysot是商汤科技推出的一个针对单目标跟踪 Single Object Tracking 的 研究平台 里面包含了他们团队的一些算法实
  • 23种设计模式之策略模式

    文章目录 概览 策略模式的优缺点 策略模式的应用场景 策略模式的结构与实现 模式的结构 模式的实现 策略模式的扩展 总结 概览 策略模式定义了一系列算法 并将每个算法封装起来 使他们可以相互替换 且算法的变化不会影响到使用算法的客户 需要设
  • Python从入门到放弃(三):基本语句和语法

    一 一些改变 1 Python增加了什么 相比起C 或者其他一些语言 Python增加了一个冒号 所有的python复合语句 都是首行由冒号来提醒 这个一定不能够掉了 且接下来是以缩进的形式来书写 C 或者一些语言是大括号括起来的 后面会看
  • 【算法与数据结构】98、LeetCode验证二叉搜索树

    文章目录 一 题目 二 解法 三 完整代码 所有的LeetCode题解索引 可以看这篇文章 算法和数据结构 LeetCode题解 一 题目 二 解法 思路分析 注意不要落入下面你的陷阱 笔者本来想左节点键值 lt 中间节点键值 lt 右节点
  • 传感器i2c与arduino连接_Arduino中进行I2C通信发送数据案例分析

    在之前的文章中 我们介绍了Arduino之间的SPI通信 今天我们将学习另一种串行通信协议 I2C 内部集成电路 比较I2C和SPI I2C只有两条线 而SPI使用四条 I2C可以有多个主机和从机 而SPI只能有一个主机和多个从机 因此 如
  • docker容器连接宿主机redis和mysql

    当我们在用docker部署项目的时候可能会遇到这样一个问题 项目A和项目B都用到了redis和mysql 如果在docker compose里link或者dependon一个redis和mysql的话 会发现每一个项目都有一个redis和m
  • static作用:静态变量的生存周期和作用域

    首先要理解生存周期与作用域的区别 生存周期 变量从定义到销毁的时间范围 存放在全局数据区的变量的生存周期存在于整个程序运行期间 而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁 除了静态变量之外的局部变量都存放于栈中 作用域 变量的