C語言static關鍵字解析

2021-09-30 09:05:16 字數 2255 閱讀 6754

1、概述

static 宣告的變數在c語言中有兩方面的特徵:

1)、變數會被放在程式的全域性儲存區中,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是它與堆疊變數和堆變數的區別。

2)、變數用static告知編譯器,自己僅僅在變數的作用範圍內可見。這一點是它與全域性變數的區別。

2、問題:static的理解

關於static變數,請選擇下面所有說法正確的內容:

a、若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;

b、若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;

c、設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題;

d、靜態全域性變數過大,可那會導致堆疊溢位。

答案與分析:

對於a,b:根據本篇概述部分的說明b),我們知道,a,b都是正確的。

對於c:根據本篇概述部分的說明a),我們知道,c是正確的(所謂的函式重入問題,下面會詳細闡述)。

對於d:靜態變數放在程式的全域性資料區,而不是在堆疊中分配,所以不可能導致堆疊溢位,d是錯誤的。

因此,答案是a、b、c。 

3、問題:不可重入函式

intsum_int( unsigned 

intbase

)return

sum;

答案與分析:

所謂的函式是可重入的(也可以說是可**的),即:只要輸入資料相同就應產生相同的輸出。

這個函式之所以是不可**的,就是因為函式中使用了static變數,因為static變數的特徵,這樣的函式被稱為:帶「內部儲存器」功能的的函式。因此如果我們需要乙個可重入的函式,那麼,我們一定要避免函式中使用static變數,這種函式中的static變數,使用原則是,能不用盡量不用。

將上面的函式修改為可重入的函式很簡單,只要將宣告sum變數中的static關鍵字去掉,變數sum即變為乙個auto 型別的變數,函式即變為乙個可重入的函式。

當然,有些時候,在函式中是必須要使用static變數的,比如當某函式的返回值為指標型別時,則必須是static的區域性變數的位址作為返回值,若為auto型別,則返回為錯指標。

說明(1).引自

(2). from: c語言測試:想成為嵌入式程式設計師應知道的0x10個基本問題

6. 關鍵字static的作用是什麼?

這個簡單的問題很少有人能回答完全。在c語言中,關鍵字static有三個明顯的作用:

•; 在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。

•; 在模組內(但在函式體外),乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。

•; 在模組內,乙個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。

大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是乙個應試者的嚴重的缺點,因為他顯然不懂得本地化資料和**範圍的好處和重要性。 

1.static 全域性變數與普通全域性變數的區別:

在定義變數時,全域性變數之前再冠以 static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。兩者在儲存方式上並無不同。兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各原始檔中都是有效的。而靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其他原始檔中不能使用。由於靜態全域性變數的作用域侷限域於乙個原始檔內,只能為該原始檔內的函式使用,因此可以避免其他原始檔 使用該變數。把普通全域性變數改變為靜態全域性變數是改變了他的作用域,限制了他的使用範圍。

2.static 區域性變數和普通區域性變數的區別:

普通區域性變數所在的函式每次被呼叫都會被重新定義並分配儲存空間,而 static 區域性變數不會,他的值始終儲存著。static 區域性變數只被初始化一次,下一次使用時依舊是上一次的值。

3.static 函式與普通函式的區別:

static 函式(即靜態函式,在函式定義時加上了static 關鍵字)與普通函式作用域不同,他僅存在於文字檔案中。只在當前原始檔中使用的函式應該說明為內部函式(即加上static關鍵字)。內部函式應該在當前 原始檔中宣告和定義。對於可在當前原始檔以外的函式,應該在乙個標頭檔案中說明,要使用這個函式的原始檔要包含這個標頭檔案。另:程式的普通全域性變數存在於堆 棧中,全域性變數、static 區域性變數存在於靜態儲存區中。

解析關鍵字static

大家都知道static的意思是靜態的,靜止的,同樣的,不管在c語言還是c 中,static作為關鍵字的意思仍為靜止的,靜態的。現在我們就來仔細談下static在c語言和c 中的用法。c語言 static可修飾變數和函式。1.static在修飾變數時,又可分為修飾區域性變數和全域性變數。1 在修飾區域...

C語言關鍵字Static

c語言中static的語義 1.static變數 1 區域性 a.靜態區域性變數在函式內定義,生存期為整個源程式,但作用域與自動變數相同,只能在定義該變數的函式內使用。退出該函式後,儘管該變數還繼續存在,但不能使用它。b.對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變...

c語言static關鍵字

以前一直覺得static關鍵字僅僅是定義乙個靜態的變數,今天在看書的時候發現一切沒那麼簡單,遂決定記錄下來。1.static關鍵字指明變數是乙個靜態變數,即static修飾的區域性變數並不是分配在棧中,而是分配在程式的靜態區中,所以在函式呼叫後其記憶體並不會被釋放。這裡需要注意乙個點,也就是說並不是...