管瑜琳
全局變量具有全局作用域。全局變量只需在一個源文件中定義,就可以作用于所有的源文件。利用全局變量的特性,可以進行自動讀題,然后根據預置答案,從答案中進行正確挑選,自動進行人機對話。
【關鍵詞】全局變量 存儲區域 應用淺析
自動回答題庫中的問題,在沒有人工智能AlphaGo的情況下,是否可以實現?答案顯然是有可能的。
在沒有超級計算機,沒有云計算,沒有云數據的前提下,我們完全可以利用個人電腦,利用全局變量的特性,進行自動讀題,然后根據預置答案,從答案中進行正確挑選,實現偽人工智能。
1 變量定義及存儲區域
在程序語言中,對于基本數據類型量,按其值是否可變又分為常量和變量兩種。變量按作用域范圍又可分為兩種:局部變量和全局變量。除此以外,變量還有外部變量、內部變量、靜態變量以及動態變量等這些叫法。
在這里,我們只是對這些變量進行簡單的定義闡述,并區分變量各自的存儲區域,并著重說明全局變量的一些特殊應用。
1.1 變量定義
常量——在程序執行過程中,其值不能改變的量。常量可以直接用1個數來表示,稱為常數(或稱為直接常量)。
變量——在程序執行過程中,其值可以改變的量。
局部變量——Local Variable,也稱為內部變量,定義在函數內部,它的作用域僅限于函數內, 離開該函數后再使用就是錯誤的。
全局變量——Global Variable,也稱為外部變量,定義在所有函數外部,它的作用域是整個源程序。
靜態變量——就是在定義的時候,有static 修飾的變量。
動態變量——在程序執行過程中建立,隨函數的調用動態分配存儲空間,調用結束,釋放空間。
這么多變量,其實各種名稱都是相對的,例如:常量與變量,局部變量與全局變量,都是從不同的角度而言。
1.2 變量的作用域
全局變量具有全局作用域。全局變量只需在一個源文件中定義,就可以作用于所有的源文件。當然,其他不包含全局變量定義的源文件需要用extern 關鍵字再次聲明這個全局變量。
靜態局部變量具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在,它和全局變量的區別在于全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見。
局部變量也只有局部作用域,它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束后,變量被撤銷,其所占用的內存也被收回。
靜態全局變量也具有全局作用域,它與全局變量的區別在于如果程序包含多個文件的話,它作用于定義它的文件里,不能作用到其它文件里,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變量,它們也是不同的變量。
1.3 變量的存儲區域
用戶存儲空間可以分為三個部分:程序區、靜態存儲區、動態存儲區。因此從另一個角度而言,從變量值存在的作時間(即生存期)角度來分,變量又可以分為靜態存儲方式和動態存儲方式。
靜態存儲方式:是指在程序運行期間分配固定的存儲空間的方式。
動態存儲方式:是在程序運行期間根據需要進行動態的分配存儲空間的方式。
全局變量、靜態局部變量、靜態全局變量全部都在靜態存儲區分配空間,在程序開始執行時給全局變量分配存儲區,程序行完畢就釋放。在整個程序執行過程中,它們占據固定的存儲單元,而不進行動態的分配和釋放。
局部變量、動態變量在動態存儲區分配空間。除此以外,動態存儲區還存放以下數據:動態申請的變量,函數形式參數,函數調用實的現場保護和返回地址等,即通常工程師平常提到的“堆”和“棧”(堆和棧是分別指向不同的區域)。
2 全局變量應用淺析
從定義、作用域和存儲區域等方面進行了各種闡述,可以得出以下幾個結論:
(1)動態變量由于分配的時間、次序不同,而導致地址也很有可能不同。
(2)局部變量的地址是跟其作用域相關的函數有關,因此地址可以說是固定的。
(3)靜態存儲方式的全局變量、靜態全局變量、靜態局部變量,其地址都是在編譯過程中就為其分配好了。只要bin(這個bin是泛稱,即軟件項目工程最終編譯生成目標,有可能是exe執行程序,也有可能是一個單片機的二進制文件,與最終后綴名無關)不變,其地址就不會改變。甚至可以說,庫不變,庫中的靜態存儲方式的全局變量也不會發生變更。
說了這么多,其實就是讓大家明白一點:在一個正式發布的應用程序再次升級前,這個應用程序中的靜態存儲方式的全局變量、靜態全局變量、靜態局部變量(下文簡單點只說全局變量),其地址是固定不變的,不會每次運行得到不同的值(當然這個地址是針對其所在的Task而言)。因此,如果我們得到程序某個全局變量的地址,以后可以直接對這個地址進行操作,這個地址在應用程序升級。
知道了全局變量是固定的地址,那么會有什么信息是用全局變量的?
軟件開發者為了開發方便,有時會定義全局變量以方便使用。比如在游戲中常會出現的人機對話頁面,那么怎樣才能自動讀題,自動作答呢?
人機界面對話的題庫內容肯定是個常量,但是在顯示時有可能會將內容復制到一個全局變量的buffer中,甚至標準答案可能也是固定地址。那我們可以通過人機對話對話框的固定地址來解析具體是題庫中的哪個問題,甚至將ABCD選項和標準答案進行內容匹配來判斷最終正確的選項是哪個。這樣的情況下,只要一出現人機對話,就可以知道問道問題是題庫中的哪一個,然后回答中的選項與標準答案進行比對,自動進行人機對話應答。
3 結束語
在大型程序的開發過程中,數據共享問題是一個復雜的綜合性問題,在開發之前,合理的定義全局變量的函數名和定義,能夠有效的提高讀寫效率,減少由于實際參數和形式參數的數據傳遞帶來的時間消耗。
參考文獻
[1]譚浩強.C語音程序設計(第一版)[M].北京:清華大學出版社,2004.
作者單位
上海飛機設計研究院綜合航電系統研究部 上海市 201210