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

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

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

转载:https://blog.csdn.net/qibanxuehua/article/details/52702606
**应用:static的延迟静态绑定
见:https://blog.csdn.net/bloodperfect/article/details/52416837

转载于:https://www.cnblogs.com/bigclould/p/9322248.html

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

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

相关文章

刘强东痛批京东高管,拿PPT骗他!网友怒了:爱用 PPT 忽悠的人,他们都遭人痛恨...

这是头哥侃码的第272篇原创因为被新冠感染&#xff0c;所以最近两周都在休养。前几天&#xff0c;我无意中看到一则有关刘强东的新闻&#xff0c;大致是他在京东内部管理培训会上痛批部分高管&#xff0c;称 “拿PPT和假大空词汇忽悠自己的人就是骗子”&#xff0c;表示部分高管…

关于file的部分简单命令

1.关于file的简单命令 2.创建/删除 文件/目录 ## -f和-r可以连用&#xff0c;表示强制删除 3.文件/目录的复制 ##复制是一个新建的过程&#xff0c;在保持原有不变的基础上重新再建立一个 4.文件/目录的移动 ##移动是一个重命名的过程&#xff0c;但不改变其中的内容 本文转自…

字节与浮点型转换软件_如何与另一个防病毒软件一起运行恶意软件字节

字节与浮点型转换软件Malwarebytes Anti-Malware is a great security tool that’s particularly effective against “potentially unwanted programs (PUPs)” and other nasty software traditional antivirus programs don’t deal with. But it’s intended to be used a…

vsftpd服务的搭建

1.vsftpd介绍vsftpd&#xff1a;是非常安全的ftp守护进程(Very secure ftp Daemon)。进程&#xff1a;正在进行&#xff08;运行running&#xff09;的程序。守护进程Daemon&#xff1a;网络服务类的程序都会有守护进程。守护进程是指实时监测服务访问状态的程序。通常都是在系…

火狐浏览器书签(收藏夹)全部消失,历史记录也消失,如何恢复

今天关闭再打开火狐浏览器瞬间懵逼&#xff0c;浏览器所有的记录都没了&#xff0c;映入眼帘的的火狐新手指导页&#xff0c;而且主页导航变成了hao123&#xff0c;我估计是外部程序篡改了浏览器配置&#xff0c;或者其他异常导致浏览器重置。书签、历史记录对开发人员的重要性…

apple tv 开发_如何防止Apple TV进入睡眠状态

apple tv 开发Your Apple TV, by default, goes to sleep fairly quickly when not in use. That’s great for power saving but not so great if you like to keep it on. Let’s take a look at how to extend how long it stays awake or disable sleep mode altogether. 默…

MASA MAUI Plugin (七)应用通知角标(小红点)Android+iOS

背景MAUI的出现&#xff0c;赋予了广大Net开发者开发多平台应用的能力&#xff0c;MAUI 是Xamarin.Forms演变而来&#xff0c;但是相比Xamarin性能更好&#xff0c;可扩展性更强&#xff0c;结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项目…

SAP如何查看会计凭证

比如SAP中已经存在着很多会计凭证&#xff0c;你想要进入SAP随便看看会计凭证的列表&#xff0c;怎么操作呢&#xff1f;事务码 IDCNDOC运行结果看到了凭证们&#xff0c;和每个凭证的行项目们上图看到的结果比较凌乱实际上我们重新进入IDCNDOC可以通过输入的勾选&#xff0c;选…

Spring Data Redis与Jedis的选择(转)

说明&#xff1a;内容可能有点旧&#xff0c;需要在业务上做权衡。 Redis的客户端有两种实现方式&#xff0c;一是可以直接调用Jedis来实现&#xff0c;二是可以使用Spring Data Redis&#xff0c;通过Spring的封装来调用。应该使用哪一个呢&#xff1f;基于当前版本Spring Dat…

C# 温故而知新:Stream篇(五)

MemoryStream 目录&#xff1a; 1 简单介绍一下MemoryStream 2 MemoryStream和FileStream的区别 3 通过部分源码深入了解下MemoryStream 4 分析MemorySteam最常见的OutOfMemory异常 5 MemoryStream 的构造 6 MemoryStream 的属性 7 MemoryStream 的方法 8 MemoryStream 简单示例…

dosbox 自动运行_如何使用DOSBox运行DOS游戏和旧应用

dosbox 自动运行New versions of Windows don’t fully support classic DOS games and other old applications — this is where DOSBox comes in. It provides a full DOS environment that runs ancient DOS apps on modern operating systems. Windows的新版本不完全支持经…

WPF 自定义放大镜控件

控件名&#xff1a;Magnifier作 者&#xff1a;WPFDevelopersOrg - 驚鏵原文链接[1]&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;实现此功能需要用到 VisualBrush &#xff0c;放大镜展现使用 Canvas ->…

springboot小笔记

如果默认通过IDEA的springboot 插件布置的 的初始启动类是这样的&#xff0c;这种就是一个普通的java类&#xff0c;只能以jar打包 package com.how2java.springboot;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.Sprin…

.NET实现之(WebBrowser数据采集—续篇)

我们继续“.NET实现之(WebBrowser数据采集)“系列篇之最后一篇&#xff0c;这篇本人打算主要讲解怎么用WebBrowser控件来实现“虚拟”的交互性程序&#xff1b;比如我们用Winform做为宿主容器&#xff0c;用Asp.net做相关收集程序页面&#xff0c;我们需要通过客户端填写相关数…

ipad和iphone切图_如何在iPhone,iPad和Mac上使消息静音

ipad和iphone切图If you use Messages on your iPhone, iPad, or Mac, then you probably know how quickly you can become overrun with message notifications, especially if you’re part of a group message. Thankfully, there’s an easy way to mute specific message…

Pipy 实现 SOCKS 代理

上篇我们介绍了服务网格 osm-edge 出口网关使用的 HTTP 隧道&#xff0c;其处理方式与另一种代理有点类似&#xff0c;就是今天要介绍的 SOCKS 代理。二者的主要差别简单来说就是前者使用 HTTP CONNECT 告知代理目的地址&#xff0c;而后者则是通过 SOCKS 协议。值得一提的是&a…

python拓展7(Celery消息队列配置定时任务)

介绍 celery 定时器是一个调度器&#xff08;scheduler&#xff09;&#xff1b;它会定时地开启&#xff08;kicks off&#xff09;任务&#xff0c;然后由集群中可用的工人&#xff08;worker&#xff09;来执行。 定时任务记录&#xff08;entries&#xff09;默认 从 beat_s…

Asia Yokohama Regional Contest 2018 G题 What Goes Up Must Come Down(树状数组求逆序对)

https://codeforces.com/gym/102082 题意&#xff1a; 给一个数组大小不超过1e5&#xff0c;每个数的值也是1e5以内&#xff0c;可以交换相邻两个数&#xff0c;求保证它呈现一个非递减再非递增的趋势的最小交换次数。 题解&#xff1a;对每个数来说&#xff0c;只有两种情况&a…

Android系统的开机画面显示过程分析(8)

3. 第三个开机画面的显示过程第三个开机画面是由应用程序bootanimation来负责显示的。应用程序bootanimation在启动脚本init.rc中被配置成了一个服务&#xff0c;如下所示&#xff1a;service bootanim /system/bin/bootanimation user graphics group graphics disabled o…

chrome连接已重置_如何重置(或调整)Chrome的下载设置

chrome连接已重置By default, Chrome saves all downloaded files to the same location—a dedicated “Downloads” folder. The thing is, this isn’t always practical for all types of download files. The good news is you can easily tweak this setting. 默认情况下…