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、問題:不可重入函式
曾經設計過如下乙個函式,在**檢視的時候被提醒有
bug,因為這個函式是不可重入的,為什麼?
unsigned int sum_int( unsigned int base )
return sum;}
答案與分析:
所謂的函式是可重入的(也可以說是可**的),即:只要輸入資料相同就應產生相同的輸出。
這個函式之所以是不可**的,就是因為函式中使用了
static
變數,因為
static
變數的特徵,這樣的函式被稱為:帶
「內部儲存器
」功能的的函式。因此如果我們需要乙個可重入的函式,那麼,我們一定要避免函式中使用
static
變數,這種函式中的
static
變數,使用原則是,能不用盡量不用。
將上面的函式修改為可重入的函式很簡單,只要將宣告
sum變數中的
static
關鍵字去掉,變數
sum即變為乙個
auto
型別的變數,函式即變為乙個可重入的函式。
當然,有些時候,在函式中是必須要使用
static
變數的,比如當某函式的返回值為指標型別時,則必須是
static
的區域性變數的位址作為返回值,若為
auto
型別,則返回為錯指標。
水滴石穿C語言之static辨析
1 概述 static 宣告的變數在c語言中有兩方面的特徵 1 變數會被放在程式的全域性儲存區中,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是它與堆疊變數和堆變數的區別。2 變數用static告知編譯器,自己僅僅在變數的作用範圍內可見。這一點是它與全域性變數的區別。2 問題 static...
水滴石穿C語言之指標綜合談
概述 joel spolsky認為,對指標的理解是一種aptitude,不是通過訓練就可以達到的。雖然如此,我還是想談一談這個c c 語言中最強勁也是最容易出錯的要素。鑑於指標和目前計算機記憶體結構的關聯,很多c語言比較本質的特點都孕育在其中,因此,本篇和第 六 第七兩篇我都將以指標為主線,結合在實...
水滴石穿C語言之typedef的問題
1.基本解釋 typedef為c語言的關鍵字,作用是為一種資料型別定義乙個新名字。這裡的資料型別包括內部資料型別 int,char等 和自定義的資料型別 struct等 在程式設計中使用typedef目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比較複雜的型別宣告。至於ty...