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.pswp.cn/news/279849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279849.shtml
英文地址,請注明出處:http://en.pswp.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. 默認情況下…