返回區域性變數或臨時變數的位址 變數的儲存型別

2021-10-11 02:29:24 字數 1865 閱讀 7901

按照變數的作用域(即從空間)角度分:可以分為全域性變數和區域性變數。

按照變數的生存期(即從時間)角度分:可以分為靜態儲存方式和動態儲存方式。靜態儲存方式:是指在程式執行期間分配固定的儲存空間的方式。動態儲存方式:是在程式執行期間根據按需分配進行動態的分配儲存空間方式。

使用者儲存空間可以分為程式區、靜態儲存區、動態儲存區。全域性變數全部存放在靜態儲存區,在程式開始執行時給全域性變數分配儲存區,程式執行完畢就釋放。程式執行時它們佔據固定的記憶體單元,而不動態分配和釋放。

動態儲存區存放以下資料:

1) 函式引數形式;

2) 自動變數(未加static宣告的區域性變數);

3) 函式呼叫時的現場保護和返回位址。

備註:在c語言中,函式和變數的雙重屬性貫穿始終:資料型別和資料儲存類別。

auto變數:

自動變數用關鍵字auto作儲存類別宣告。例如:

int f(int a) /*定義f函式,a為引數*/

{auto int b,c=3; /*定義b,c自動變數*/

a是形參,b,c是自動變數,對c賦初值3。執行完f函式後,自動釋放a,b,c所佔的儲存單元。關鍵字auto可以省略,auto不寫則隱含定為「自動儲存類別」,屬於動態儲存方式。

static宣告區域性變數:

函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,這時就應該指定區域性變數為「靜態區域性變數」,用關鍵字static進行宣告。

對靜態區域性變數的說明:

1) 態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬於動態儲存類別,佔動態儲存空間,函式呼叫結束後即釋放。

2) 靜態區域性變數在編譯時賦初值,即只賦初值一次;而對自動變數賦初值是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當於執行一次賦值語句。

3) 如果在定義區域性變數時不賦初值的話,則對靜態區域性變數來說,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)。而對自動變數來說,如果不賦初值則它的值是乙個不確定的值。

register變數

為了提高效率,c語言允許將區域性變數得值放在cpu中的暫存器中,這種變數叫「暫存器變數」,用關鍵字register作宣告。

說明:1) 只有區域性自動變數和形式引數可以作為暫存器變數;

2) 乙個計算機系統中的暫存器數目有限,不能定義任意多個暫存器變數;

3) 區域性靜態變數不能定義為暫存器變數。

用extern宣告外部變數

外部變數(即全域性變數)是在函式的外部定義的,它的作用域為從變數定義處開始,到本程式檔案的末尾。如果外部變數不在檔案的開頭定義,其有效的作用範圍只限於定義處到檔案終了。如果在定義點之前的函式想引用該外部變數,則應該在引用之前用關鍵字extern對該變數作「外部變數宣告」。表示該變數是乙個已經定義的外部變數。有了此宣告,就可以從「宣告」處起,合法地使用該外部變數。用extern宣告外部變數,擴充套件程式檔案中的作用域。

int max(int x,int y)

{int z;

z=x>y?x:y;

return(z);

main()

{extern a,b;

printf("%dn",max(a,b));

inta=13,b=-8;

說明:在本程式檔案的最後1行定義了外部變數a,b,但由於外部變數定義的位置在函式main之後,因此本來在main函式中不能引用外部變數a,b。現在我們在main函式中用extern對a和b進行「外部變數宣告」,就可以從「宣告」處起,合法地使用該外部變數a和b。

C語言中返回區域性變數或臨時變數的位址的錯誤

先看如下 在編譯執行的時候會丟擲警告 warning c4172 返回區域性變數或臨時變數的位址,並且在main函式中的列印結果不符合我們的預期 如下 int visitarea int main 列印結果 10 2 2 請按任意鍵繼續.我們通過上面可以發現main函式呼叫visitarea 返回v...

區域性變數位址的返回

char fun 這個函式的返回值?以及這個函式在棧上的儲存布局 include include include char fun int main int argc,const char argv 就函式而言,返回區域性變數的位址這種做法是錯誤的,但是這個函式不管是在vs還是在gcc上編譯時都只會...

臨時變數 區域性變數,return的效率

如果函式返回值是乙個物件,要考慮 return 語句的效率。例如 return string s1 s2 這是臨時物件的語法,表示 建立乙個臨時物件並返回它 不要以為它與 先建立乙個區域性物件 temp 並返回它的結果 是等價的,如 string temp s1 s2 return temp 實質不...