C C 記憶體小結

2021-10-04 07:42:16 字數 1389 閱讀 7936

記憶體用於儲存程式中的資料,由儲存期、作用域和鏈結表徵。儲存期可 以是靜態的、自動的或動態分配的。如果是靜態儲存期,在程式開始執行時 分配記憶體,並在程式執行時都存在。如果是自動儲存期,在程式進入變數定 義所在塊時分配變數的記憶體,在程式離開塊時釋放記憶體。如果是動態分配存 儲期,在呼叫malloc()(或相關函式)時分配記憶體,在呼叫free()函式時釋放 記憶體。

作用域決定程式的哪些部分可以訪問某資料。定義在所有函式之外的變 量具有檔案作用域,對位於該變數宣告之後的所有函式可見。定義在塊或作 為函式形參內的變數具有塊作用域,只對該塊以及它包含的巢狀塊可見。

鏈結描述定義在程式某翻譯單元中的變數可被鏈結的程度。具有塊作用 域的變數是區域性變數,無鏈結。具有檔案作用域的變數可以是內部鏈結或外 部鏈結。內部鏈結意味著只有其定義所在的檔案才能使用該變數。外部鏈結 意味著其他檔案使用也可以使用該變數。

下面是c的5種儲存類別(不包括執行緒的概念)。

自動——在塊中不帶儲存類別說明符或帶 auto 儲存類別說明符宣告的 變數(或作為函式頭中的形參)屬於自動儲存類別,具有自動儲存期、塊作 用域、無鏈結。如果未初始化自動變數,它的值是未定義的。

暫存器——在塊中帶 register 儲存類別說明符宣告的變數(或作為函式 頭中的形參)屬於暫存器儲存類別,具有自動儲存期、塊作用域、無鏈結, 且無法獲取其位址。把乙個變數宣告為暫存器變數即請求編譯器將其儲存到 訪問速度最快的區域。如果未初始化暫存器變數,它的值是未定義的。

靜態、無鏈結——在塊中帶static儲存類別說明符宣告的變數屬於「靜 態、無鏈結」儲存類別,具有靜態儲存期、塊作用域、無鏈結。只在編譯時 被初始化一次。如果未顯式初始化,它的位元組都被設定為0。

靜態、外部鏈結——在所有函式外部且沒有使用 static 儲存類別說明符 宣告的變數屬於「靜態、外部鏈結」儲存類別,具有靜態儲存期、檔案作用 域、外部鏈結。只能在編譯器被初始化一次。如果未顯式初始化,它的位元組 都被設定為0。

靜態、內部鏈結——在所有函式外部且使用了 static 儲存類別說明符聲 明的變數屬於「靜態、內部鏈結」儲存類別,具有靜態儲存期、檔案作用域、 內部鏈結。只能在編譯器被初始化一次。如果未顯式初始化,它的位元組都被 設定為0。

動態分配的記憶體由 malloc()(或相關)函式分配,該函式返回乙個指向 指定位元組數記憶體塊的指標。這塊記憶體被free()函式釋放後便可重複使用, free()函式以該記憶體塊的位址作為引數。

型別限定符const、volatile、restrict和_atomic。const限定符限定資料在 程式執行時不能改變。對指標使用const時,可限定指標本身不能改變或指 針指向的資料不能改變,這取決於const在指標宣告中的位置。volatile 限定 符表明,限定的資料除了被當前程式修改外還可以被其他程序修改。該限定 符的目的是警告編譯器不要進行假定的優化。restrict限定符也是為了方便編 譯器設定優化方案。restrict限定的指標是訪問它所指向資料的唯一途徑。

C C 學習小結

首先簡單了解一下程序的記憶體分配。程序被裝載到一塊記憶體中,記憶體分為以下區域 區 text 程式需要執行的指令,即各函式編譯生成的指令。資料區 包含了明確被初始化的全域性變數,所有 靜態變數,和資料常量。未初始化資料區 bss 該部分資料在程式執行前被核心初始化為0或者null。棧區 儲存區域性變...

C C 筆試小結

若使用陣列作函式實參,則以下正確的說法是 a 必須在主調函式中說明此陣列的大小b 實參陣列型別與形引數組型別可以不匹配c 在被呼叫函式中,不需要考慮形引數組的大小d 實參陣列名與形參陣列名必須一致以下程式的輸出結果為 int i void prt main 全域性變數 i main 中修改為i 5 ...

c c 記憶體管理

我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...