色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

C語言函數(shù)退出后,局部變量就被釋放了,為何會有這一過程?

方一強2年前13瀏覽0評論

這個問題我正好整理過:

之前我的文章里討論過C語言中的全局變量和局部變量,并且介紹了局部變量在函數(shù)返回后,就會被釋放。而全局變量卻可以一直保存到程序結(jié)束,這是為什么呢?

在回答這個問題之前,請看下面這張非常經(jīng)典的圖:這個圖就是程序在運行所需的內(nèi)存布局。簡單來說,就是程序在運行時會占用內(nèi)存,占用的內(nèi)存每個區(qū)域用途都是不同的,有的區(qū)域用做堆區(qū),有的用做棧區(qū),等等。

為什么函數(shù)返回時,局部變量就不能用了

程序每調(diào)用一個函數(shù),系統(tǒng)就自動在棧區(qū)劃分一塊區(qū)域給該函數(shù)使用,函數(shù)內(nèi)部定義的局部變量,也存在此處。因為并不能知道系統(tǒng)分配的棧區(qū)原來填充的是什么樣的數(shù)據(jù),所以如果函數(shù)內(nèi)部定義的局部變量沒有初始化(沒有賦初值)就使用它,它的值也是未知的。

當(dāng)函數(shù)執(zhí)行完畢,返回時,系統(tǒng)將收回這塊分配的棧區(qū),所以函數(shù)的局部變量的值就不能繼續(xù)使用了。

說了這么多空的,我們來看一個例子,下面的代碼非常簡單,就是在test函數(shù)中定一個了一個局部int型變量i,然后打印出它的值,再賦值為321,然后在main函數(shù)中調(diào)用它兩次。

在編譯執(zhí)行前,根據(jù)我們的理論,局部變量如果沒有初始化,那它的值是未知的,因此第一個test調(diào)用,會打印出隨機的一個數(shù)。雖然第一個test函數(shù)在最后對局部變量i賦值了321,但是在它返回后,就被釋放了。因此第二次調(diào)用test時,輸出應(yīng)該還是一個隨機數(shù)。那對不對呢?編譯執(zhí)行,發(fā)現(xiàn)程序輸出

134567128
321

出乎意料,第二次打印出的值正是第一個test末尾賦的值321。有一種初學(xué)者是這樣,原本就沒有把這條語法規(guī)則記牢,或者對自己的記憶力沒信心,看到這個結(jié)果就會想:哦那肯定是我記錯了,改過來記吧,應(yīng)該是“函數(shù)中的局部變量具有一直存在的固定的存儲空間,每次函數(shù)調(diào)用時使用它,返回時也不釋放,再次調(diào)用函數(shù)時它應(yīng)該還能保持上次的值”。

還有一種初學(xué)者是懷疑論者或不可知論者,看到這個結(jié)果就會想:教材上明明說“局部變量的存儲空間在每次函數(shù)調(diào)用時分配,在函數(shù)返回時釋放”,那一定是教材寫錯了,教材也是人寫的,是人寫的就難免出錯,哦,連C99也這么寫的啊,C99也是人寫的,也難免出錯,或者C99也許沒錯,但是反正運行結(jié)果就是錯了,計算機這東西真靠不住,太容易受電磁干擾和宇宙射線影響了,我的程序?qū)懙迷僬_也有可能被干擾得不能正確運行。

這兩種想法當(dāng)然不對。我們說,因為并不能知道系統(tǒng)分配的棧區(qū)原來填充的是什么樣的數(shù)據(jù),所以如果函數(shù)內(nèi)部定義的局部變量沒有初始化(沒有賦初值)就使用它,這個未知的值可以是隨機的,那既然是隨機值,它為什么不可以恰好是321呢?

函數(shù)返回后,系統(tǒng)收回原分配的棧區(qū),卻不一定會去清零它。如果下一次,恰好又把這塊棧區(qū)分配給test函數(shù),局部變量i所在的區(qū)域恰好是上一次i所在的區(qū)域,而上次test函數(shù)返回之前,把這塊區(qū)域賦值為321了,那這次i的“未知值”就正好是321也就不奇怪了,對吧。

為了驗證我們上面的解答,我們在兩個test之間加一行printf,再做次實驗:

再編譯執(zhí)行,發(fā)現(xiàn)輸出為

134567128

看到?jīng)],第一個test函數(shù)末尾賦的值,并不能保證一定傳給下一次test。

未初始化的局部變量的值是不確定的,上一次誰使用過這一塊的棧區(qū),恰好留在局部變量所在區(qū)域的值等于幾,這次局部變量的未初始化的默認(rèn)值就是幾。

全局變量為什么可以一直保留到程序結(jié)束?

這是因為,全局變量要么保存在bss段,要么保存在data段,這兩個段會一直保留到程序結(jié)束。

未初始化的全局變量保存在bss段,已初始化的全局變量保存在data段。

歡迎在評論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。