儲存類 鏈結和記憶體管理

2021-08-18 15:07:26 字數 1658 閱讀 7198

作用域

鏈結乙個c變數具有下列鏈結之一:外部鏈結、內部鏈結或空鏈結。具有**塊作用域或者函式原型作用域的變數有空鏈結,意味著它們是由其定義所在的**塊或者函式原型所私有的。具有檔案作用域的變數可能有內部或者外部鏈結。乙個具有外部鏈結的變數可以在乙個多檔案程式的任何地方使用。乙個具有內部鏈結的變數可以在乙個檔案的任何地方使用。關鍵字static表明變數具有內部鏈結,即該變數是當前檔案所私有的,但是可以被檔案中的任意函式使用。

儲存時期

乙個c變數有以下兩種儲存時期之一:靜態儲存時期和自動儲存時期。如果乙個變數具有靜態儲存時期,它在程式執行期間將一直存在。具有檔案作用域的變數,不管是內部鏈結還是外部鏈結,都是靜態儲存時期;

具有**塊作用域的變數一般情況下就有自動儲存時期。在程式進入定義這些變數的**塊時,將為這些變數分配記憶體;檔推出這個**塊時,分配的記憶體將被釋放。該思想把自動儲存類的變數使用的記憶體視為乙個可以重複使用的工作區或者暫存記憶體。

儲存類儲存時期--自動 作用域--**塊 鏈結--空 宣告方式--**塊內

預設情況下,在**塊或函式的頭部定義的任意變數都屬於自動儲存類,使用關鍵字suto可以使意圖更加明顯;

除非顯式的初始化自動變數,否則它不會被初始化,它的初始值是先前占用分配給它的空間的任意值。

儲存時期--自動 作用域--**塊 鏈結--空 宣告方式--**塊內,使用關鍵字register

通常,變數儲存在計算機記憶體中,如果幸運,暫存器變數可以被儲存在cpu暫存器中,或更一般的,儲存在速度更快的可用記憶體中,從而可以比普通變數更快的訪問和操作,因為尹村器變數多是存放在乙個暫存器而非計算機記憶體中,因此無法獲得暫存器變數的位址。

使用關鍵字register可以宣告乙個變數,但是宣告僅僅是乙個請求,編譯器在請求和可用暫存器的個數和高速記憶體的數量之間做權衡,所以,一般情況下,它都是乙個自動變數而不是暫存器變數,但是,仍然無法獲得暫存器的位址。

儲存時期--靜態 作用域--檔案 鏈結--外部 宣告方式--所有函式之外

為了使得程式更加清晰,可以在使用外部變數的函式中使用關鍵字extern來再次宣告它。如果變數是在別的檔案中定義的,使用extern是必須的。在使用外部變數的函式中宣告它不過是為了表明在這個函式中會使用這個變數,但是如果漏掉了extern關鍵字,就會建立乙個自動變數,並且覆蓋外部變數的定義。

和自動變數一樣,外部變數可以被顯式的初始化,但是如果不初始化,它們會自動初始化為0,在外部宣告的陣列變數也是如此。但是,外部變數只能用常量來宣告。

外部變數第一次宣告時為起留出了儲存空間,它構成了變數的定義。第二次宣告只是為了告訴編譯器要使用先前定義的變數,因此不是乙個定義。第一次宣告成為定義宣告,第二次宣告成為引用宣告。關鍵字extern表明該變數不是乙個定義,因為它指示編譯器參考其他地方。

不要用extern來進行外部定義,只用它來引用乙個已經存在的外部定義,乙個外部變數只能進行一次初始化,而且一定是在變數被定義時進行。

儲存時期--靜態 作用域--檔案 鏈結--內部 宣告方式--所有函式之外,使用關鍵字static

儲存時期--靜態 作用域--**塊 鏈結--空 宣告方式--**塊內,使用關鍵字static

可以建立具有**塊作用域,兼具靜態儲存的區域性變數,這種變數和自動變數有相同的作用域,但是在函式呼叫之後,這種變數不會消失。從一次函式呼叫到下一次函式呼叫,計算機始終保持著它的值。在**塊內宣告為static的靜態變數,只在編譯時初始化一次,如果不顯式初始化靜態變數,它們將被初始化為0;

儲存類,鏈結和記憶體管理

一,儲存類 不同的儲存類提供了變數的作用域,鏈結以及儲存時期的不同組合。儲存時期,作用域,鏈結 儲存時期 變數在記憶體中保留的時間。函式原型作用域從變數定義處一直到原型宣告的末尾。這說明編譯器在處理乙個函式的引數時,它所關心的只是該引數的型別。乙個在所有函式之外定義的變數具有檔案作用域。二,鏈結 關...

儲存類 鏈結和記憶體管理

malloc calloc free ansi 型別限定符 冪等作用域描述了程式中可以訪問乙個識別符號的乙個或多個區域 函式作用域 函式原型作用域 從形參定義到原型宣告結束 檔案作用域 具有檔案作用域的變數可能有外部或者內部鏈結 預設是外部函式 可以被其它檔案訪問 只能用於所定義的檔案 定義在標頭檔...

C 儲存類 鏈結 記憶體管理

用於儲存程式資料的記憶體可用儲存時期 作用域 鏈結來表徵。儲存時期可以是靜態的 自動的 或是分配的。如果是靜態的,內存在程式開始執行時被分配,並在程式執行時一直存在。如果是自動的,變數所用內在程式執行到該變數定義所在 塊時才開始分配,退出 塊時釋放。如果是分配的記憶體,記憶體通過呼叫malloc 分...