水滴石穿C語言之static辨析

2021-04-24 12:27:34 字數 1434 閱讀 4263

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...