C語言理論知識 可見性,生存期

2021-09-05 08:36:25 字數 2350 閱讀 7161

void

max(

)int x=0;

void

main()

int z=

10;

首先在上面的程式中,從可見性來看,第乙個函式max()中x是無法初始化的,因為在編譯過程中編譯器是一行行掃碼的,那麼max()中的x就是沒有被初始化的變數,所以這條語句沒有作用。

然而對於全域性變數x,z來說,當程式剛開始執行初,x和y就就被初始化了,所以它的可見性並不是整個檔案,而是從它的這條語句開始到檔案末尾。

之所以max()函式中的語句沒有成功初始化是因為,對於這個程式來說是看不見全域性變數x和z的。

所以需要記住的是生存期是針對編譯通過後的執行過程的,而可見性是針對編譯過程的

int x=0;

void

main()

上面的程式中y的初始化用的x的值是100,用的是距離變數y距離較近的變數的值,如果你想使用全域性變數的值,那麼我們需要使用作用域符::

int x=0;

void

main()

在解釋生存期之前,我們要先了解一下關於,棧空間為函式分配空間的過程和棧空間的問題,鏈結如下

函式空間分配

int

*fun()

void

add(

)void

main()

當加上呼叫add()時得出的結果是乙個隨機值

而不呼叫add()時則可以得到結果10

在不呼叫add時,雖然fun()函式在執行完之後空間會被釋放,但是在這時候沒有干擾到這一塊的空間,所以p=fun()依舊指向了x的值。然而當呼叫add時,棧幀的呼叫時連續的,比如main時一樓的棧幀,fun時二樓的棧幀,當fun()執行完後釋放,又把fun的棧幀空間給了add(),同時在給add()時會將fun釋放後的空間打掃一邊會用16進製制數0xcccccccc來填充。所以同時p=fun()就失效了,這是p就變成了失效指標。只要fun()被釋放不管p能不能得到x的值都是失效指標。但是當printf()輸出乙個陣列時輸出的數可能不是全0xcccccccc應為printf()這個函式也會侵占上乙個函式的棧幀,但是他不一定會影響上乙個函式的值。如果一直測試都是那個值只能說明是運氣問題總之下面這樣的程式是據不允許的

但是

int

fun(

)void

mian()

這樣的程式是允許的應為return的x是乙個臨時量是放在cpu的暫存器中的另外全域性變數是存放在資料區的

char

*str =

"yhping"

void

main()

在上面的的程式中str是全域性變數在資料區ch是區域性變數在棧區,而hellow和yhping是常量在資料區,全域性變數還有靜態變數也在資料區靜態變數在第一次呼叫時初始化被產生而且初始化一次,它的生存期是從產生開始一直到程式的結束

int

*fun

(int x)

void

main()

}

正是應為靜態變數的這種特性,所以為了返回陣列時,可以把陣列定義為靜態變數,就可已返回陣列的值,但是這樣的方式有侷限性,所以當需要返回多個型別不同的值時建議使用結構體進行返回

struct student

;student *

fun();

return

&s;}

void

main()

這樣雖然可能得到結果,這是應為沒有被別的函式在獲取記憶體空間是沒有被替代,但是這樣做是不合法的,可能會造成錯誤,這就是函式的生存期問題。所以最好把整個結構體返回

但是有乙個例外就是malloc開闢的堆記憶體空間

int

*getarray

(int n)

//不再生存期問題中,函式空間在棧中,malloc在堆中,雖然函式死亡,但是堆空間開闢的記憶體空間依舊存在

void

main()

C語言可見性和生存期

作用域 可見性 指識別符號能夠被使用的範圍 只有在作用域內識別符號才可以被使用。此階段針對編譯和鏈結過程。1 函式中定義的識別符號,包括形參和函式體中定義的區域性變數,作用域都在該函式內,也稱作函式域。2 檔案作用域也稱全域性作用域。定義在所有函式之外的識別符號,具有檔案作用域,作用域為從定義處到整...

學習筆記 可見性和生存期

可見性 又稱為作用域。指識別符號能夠被使用的範圍,只有在作用域內識別符號才可以被使用。作用域是針對編譯和連線過程。1 函式中定義的識別符號,包括形參和函式體中定義的區域性變數,作用域都在該函式內,也稱作函式域。2 檔案作用域也成為全域性作用域,定義在所有函式之外的識別符號,具有檔案作用域,作用域從定...

變數的生存期與可見性例題

接下來舉一具體例子予以說明。other函式中a,b為靜態區域性變數,具有全域性壽命,區域性的可見性。i為全域性變數。靜態變數不初始化預設值為0。主函式中a為靜態區域性變數,b.c為動態變數。第一次主函式輸出 i 1,a 0,b 10,c 0 第一次other函式輸出 全域性變數i 32,a 2,b為...