static的理論學習

在說到static之前,需要先明確變量類型:
而在聊到變量類型之前我們可以將變量的兩個屬性好好學一學

變量的兩個屬性

作用域(scope):

從內存的角度來看,就是變量存放在棧(stack)中,還是 數據段中(Data Segment),那么stack和Data segment又有什么區別呢?

鏈接性(linkage)

分為外部鏈接性(external linkage)和內部鏈接性(internal linkage),從函數的角度來看,就是函數能訪問到的變量范圍。

存儲區

棧(stack

存儲臨時數據,例如內部變量(局部變量)和返回地址;
在下述的四種變量類型中,有且只有內部變量是存儲在棧中。

數據段(Data Segment

數據段是全局變量和靜態變量存放的主要區域,還可能包括程序的只讀數據(如字符串常量)。數據段是程序的只讀部分,用于存儲程序的全局變量和靜態變量。
在程序的整個執行期間,數據段保持不變。

變量類型:

外部變量(External Variable):

也稱為全局變量(Global Variable)。
它們在程序的整個運行期間都是可見的,并且可以在程序的任何部分被訪問。
外部變量具有外部鏈接性,這意味著它們可以在多個編譯單元(如多個源文件)中共享。

內部變量(Internal Variable):

又稱局部變量,它們只在定義它們的塊(例如函數或代碼塊)內部可見。
內部變量具有內部鏈接性,這意味著它們不能在定義它們的塊之外訪問。

靜態外部變量(Static External Variable):

當你在函數或代碼塊之外聲明一個變量,并使用static關鍵字時,它就變成了靜態外部變量。
靜態外部變量具有靜態存儲期,即它們在程序的整個生命周期內都存在,但它們只在定義它們的編譯單元中可見。
即使具有外部鏈接性,使用static關鍵字也會限制其可見性到定義它們的文件內。

靜態內部變量(Static Internal Variable):

這是在函數內部聲明的靜態變量。
與自動存儲期的局部變量不同,靜態內部變量在函數調用結束后不會消失,它們的值在下一次函數調用時仍然保持。
靜態內部變量只在定義它們的函數內可見。

分析static

可以看到有了static這個關鍵字(key word),外部變量就會被限制鏈接性,內部變量就會更改它的作用域,從而擴大了它的生命周期(LifeTime),而且在一個文件編譯(匯編)的時候,只會賦一次初值,這個待會會看到。

1.8示例

示例代碼

#include <stdio.h>int fun() {static int a = 0; return (++a);
}int main(void) {printf("a = %d\n", fun());printf("a = %d\n", fun());return 0;
}
問1:該示例代碼輸出是什么?
答1:

在這里插入圖片描述

問2:如果fun()中的static int a = 0;去掉static,輸出又是什么呢?
答2:

在這里插入圖片描述

問3:為什么static修飾的變量在返回值時會出現不同的情況?

我們先來看一下他們的各自的匯編的不同之處吧:、
有static的示例
在這里插入圖片描述
無static的示例
在這里插入圖片描述

答3:static聲明的內部變量,在鏈接性上仍然是局部的(local),然而在作用域卻變成comm,說明a在作用域上變成了全局變量,數據存儲在了data segment中。

注:諸位站友如有所收獲不如點個免費的贊,如有錯誤之處或有其它補充的點,請在評論區發表你的觀點,看到必回。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42044.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42044.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42044.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 JavaScript 中,??(雙問號運算符)和 ?.(可選鏈運算符)區別

在 JavaScript 中&#xff0c;??&#xff08;雙問號運算符&#xff09;和 ?.&#xff08;可選鏈運算符&#xff09;是兩種不同的運算符&#xff0c;用于處理不同的情況&#xff1a; 雙問號運算符 (??): ?? 運算符是空值合并運算符&#xff08;Nullish Coalescing Oper…

Android C++系列:Linux進程(一)

1. 進程概念 我們知道,每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信 息,Linux內核的進程控制塊是task_struct結構體。現在我們全面了解一下其中都有哪 些信息。 進程id。系統中每個進程有唯一的id,在C語言中用pid_t類型表示,其實就是一個非 負整數。進程的…

TypeError: Cannot read properties of null (reading ‘nextSibling‘)

做項目用的Vue3Vite, 在畫靜態頁面時&#xff0c;點擊菜單跳轉之后總是出現如下報錯&#xff0c;百思不得其解。看了網上很多回答&#xff0c;也沒有解決問題&#xff0c;然后試了很多方法&#xff0c;最后竟然發現是template里邊沒有結構的原因。。。 原來我的index.vue是這樣…

android.bp 編譯 順序

在Android平臺上&#xff0c;.bp 文件是用來定義Android編譯系統中的編譯規則的。Android編譯系統是基于Blueprint的&#xff0c;.bp 文件中定義的規則決定了如何編譯和打包應用程序。 在Android編譯系統中&#xff0c;.bp 文件中的規則通常是按照它們在文件中的順序來執行的。…

ELK+Filebeat+Kafka+Zookeeper

本實驗基于ELFK已經搭好的情況下 ELK日志分析 架構解析 第一層、數據采集層 數據采集層位于最左邊的業務服務器集群上&#xff0c;在每個業務服務器上面安裝了filebeat做日志收集&#xff0c;然后把采集到的原始日志發送到Kafkazookeeper集群上。第二層、消息隊列層 原始日志發…

conda和pip

1.眾所周知&#xff0c;pip的確是python官方&#xff08;PyPA&#xff09;推薦的Python軟件包安裝管理工具&#xff0c;在安裝Python軟件包時&#xff0c;第一反應應該是pip。正是由于pip是Python官方推薦的“正統”工具&#xff0c;所以pip只專注于Python軟件包之間的依賴&…

Matlab手搓線性回歸-非正規方程法

原理&#xff1a;wxb&#xff0c;x是輸入&#xff0c;求得的結果與真實值y求均方誤差。 采用鏈式法則求導 參數更新&#xff0c;梯度下降法&#xff08;批量梯度下降&#xff09; 隨機生成數據&#xff1a; m100&#xff1b;生成100個數據&#xff0c;并添加隨機噪聲 clear; …

基于flask的貓狗圖像預測案例

&#x1f4da;博客主頁&#xff1a;knighthood2001 ?公眾號&#xff1a;認知up吧 &#xff08;目前正在帶領大家一起提升認知&#xff0c;感興趣可以來圍觀一下&#xff09; &#x1f383;知識星球&#xff1a;【認知up吧|成長|副業】介紹 ??如遇文章付費&#xff0c;可先看…

二次元轉向SLG,B站游戲的破圈之困

文 | 螳螂觀察 作者 | 夏至 2023年是B站游戲的滑鐵盧&#xff0c;盡管這年B站的游戲營收還有40多億&#xff0c;但相比去年大幅下降了20%&#xff0c;整整少了10億&#xff0c;這是過去5年來的最大跌幅&#xff0c;也是陳睿接管B站游戲業務一年以來&#xff0c;在鼻子上碰的第…

鴻蒙語言基礎類庫:【@ohos.process (獲取進程相關的信息)】

獲取進程相關的信息 說明&#xff1a; 本模塊首批接口從API version 7開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復制轉到。…

昇思13天

ResNet50遷移學習 ResNet50遷移學習總結 背景介紹 在實際應用場景中&#xff0c;由于訓練數據集不足&#xff0c;很少有人會從頭開始訓練整個網絡。普遍做法是使用在大數據集上預訓練得到的模型&#xff0c;然后將該模型的權重參數用于特定任務中。本章使用遷移學習方法對Im…

放棄華為OD,選擇最合適而不是最難得

時間不知不覺邁入了七月&#xff0c;五月嘗試去重新找一份工作&#xff0c;但釋放出來的崗位太少了&#xff0c;難得有進華為OD的機會&#xff0c;還是比較核心的部門&#xff0c;但思來想起&#xff0c;還是放棄了。 如果想去&#xff0c;是很有機會的&#xff0c;一路過關斬…

imx6ull/linux應用編程學習(13) CMAKE

什么是cmake&#xff1f; cmake 工具通過解析 CMakeLists.txt 自動幫我們生成 Makefile&#xff0c;可以實現跨平臺的編譯。cmake 就是用來產生 Makefile 的工具&#xff0c;解析 CMakeLists.txt 自動生成 Makefile&#xff1a; cmake 的使用方法 cmake 就是一個工具命令&am…

怎么將aac文件弄成mp3格式?把aac改成MP3格式的四種方法

怎么將aac文件弄成mp3格式&#xff1f;手頭有一些aac格式的音頻文件&#xff0c;但由于某些設備或軟件不支持這種格式&#xff0c;你希望將它們轉換成更為通用的MP3格式。而且音頻格式的轉換在現在已經是一個常見且必要的操作。aac是一種相對較新的音頻編碼格式&#xff0c;通常…

大模型增量預訓練新技巧-解決災難性遺忘

大模型增量預訓練新技巧-解決災難性遺忘 機器學習算法與自然語言處理 2024年03月21日 00:02 吉林 以下文章來源于NLP工作站 &#xff0c;作者劉聰NLP NLP工作站. AIGC前沿知識分享&落地經驗總結 轉載自 | NLP工作站 作者 | 劉聰NLP 目前不少開源模型在通用領域具有不錯…

G1 和 CMS

1、CMS CMS&#xff08;Concurrent Mark Sweep&#xff0c;并發標記清除&#xff0c;是為了解決早期垃圾收集器在執行垃圾回收時導致應用程序暫停時間過長的問題而設計的。 CMS的工作流程主要包括以下幾個階段&#xff1a; 初始標記&#xff08;Initial Mark&#xff09;&…

一體化運維監控平臺:賦能各行業用戶運維升級

在當今數字化轉型的大潮中&#xff0c;企業IT系統的復雜性和規模不斷攀升&#xff0c;對運維團隊提出了前所未有的挑戰。如何高效、精準地監控和管理IT基礎設施&#xff0c;確保業務連續性和穩定性&#xff0c;成為所有企業關注的焦點。美信&#xff0c;自2007年成立以來&#…

el-scrollbar實現自動滾動到底部(AI聊天)

目錄 項目背景 實現步驟 實現代碼 完整示例代碼 項目背景 chatGPT聊天消息展示滾動面板&#xff0c;每次用戶輸入提問內容或者ai進行流式回答時需要不斷的滾動到底部確保展示最新的消息。 實現步驟 采用element ui 的el-scrollbar作為聊天消息展示組件。 通過操作dom來實…

端、邊、云三級算力網絡

目錄 端、邊、云三級算力網絡 NPU Arm架構 OpenStack kubernetes k3s輕量級Kubernetes kubernetes和docker區別 DCI(Data Center Interconnect) SD/WAN TF 端、邊、云三級算力網絡 算力網絡從傳統云網融合的角度出發,結合 邊緣計算、網絡云化以及智能控制的優勢,通…

Qt開發 | Qt創建線程 | Qt并發-QtConcurrent

文章目錄 一、Qt創建線程的三種方法二、Qt并發&#xff1a;QtConcurrent介紹三、QtConcurrent run參數說明四、獲取QtConcurrent的返回值五、C其他線程技術介紹 一、Qt創建線程的三種方法 以下是Qt創建線程的三種方法&#xff1a; 方法一&#xff1a;派生于QThread 派生于QThre…