1. 程式人生 > >C語言儲存類

C語言儲存類

儲存類、 作用域、 生命週期、 連結屬性
C 語言符號有 3 種連線屬性: 外部連線、 內部連線、 無連線。
記憶體有多種管理方法: 棧、 堆、 資料段、 bss 段、 .text 段······一個變數的儲存類屬性就是描述這個變數儲存在何種記憶體段中。
程式碼段: 在 Linux 中又叫文字段(.text) 。
只讀資料段: const 修飾的變數一般存在這段中, 不同平臺可能不一樣。
資料段: 1.顯示初始化為非零的全域性變數。 2.顯示初始化為非零的 static 區域性變數。
bss 段: 1.顯示初始化為零或者未顯示初始化的全域性變數。 2.顯示初始化為零或者未顯示初始化的 static 區域性變數
棧: 區域性變數分配在棧上, 函式呼叫傳參過程也在棧上。
堆: C 語言不會將東西自動存在堆上, 堆操作是程式設計師手動操作分配存放的。 用完後記得釋
放。 (典型的 malloc 與 free)
檔案對映區: 程序開啟檔案了以後, 將這個檔案的內容從硬碟讀到檔案的對映區, 以後在記憶體中就直接操作這個檔案, 讀寫完後儲存時在檔案寫到硬碟中去。核心對映區: 將作業系統核心程式對映到這個區域。 每個程序都有自己的獨立空間(虛擬內
存技術) , 但是, 核心是唯一的。 儲存類的關鍵字
auto: 其作用就是修飾區域性變數。 平時就是預設使用 auto 型別的, 表示自動區域性變數, 其
分配在棧上。 (所以不初始化時, 值是隨機的)
static: 第一, 它修飾區域性變數, 形成靜態區域性變數。 靜態區域性變數和非靜態區域性變數的區
別就是, 非靜態區域性變數儲存在棧上, 而靜態區域性變數儲存在資料段或者 bss 段。 第二,
修飾全域性變數。
register: 用來修飾變數, 編譯器會盡量將它分配在暫存器中, 如果該變數會被高頻率反覆
使用, 那麼 register 形式會讓程式的效率變高。 編譯器承諾將 register 修飾的變數放到寄
存器中, 但不保證一定能放入, 因為暫存器有限時, 沒有空餘的地方。
extern: 主要用來宣告全域性變數, 目的是能夠讓其他檔案可以訪問到, 為外部連結屬性。
volatile: 意思是易變的、 可變的。 用來修飾變數, 表示這個變數可以被編譯器以外的東西
改變(編譯器之內改變就是程式碼改變變數的值, 編譯之外就是編譯器在編譯程式碼之前無法預
知變數的改變, 它有可能在其他中斷已經被改變或者被硬體改變) 。 三種編譯以外的改變:
中斷引用的變數、 多執行緒中公用的變數、 硬體會更改的變數。 編譯器遇到 volatile 時不會對
該變數進行優化, 這樣就以免出錯。 應正確的使用, 濫用 volatile 可能會導致程式效率下降。
restrict: c99 中才支援的, 所以很多延續 c89 的編譯器是不支援 restrict 關鍵字, gcc 支
持的。 restrict 也是和編譯器行為特徵有關的。 restrict 只用來修飾指標, 不能修飾普通變
量。 該關鍵字用於告訴編譯器, 該指標所指向內容的全部操作全部基於該指標, 即不存在其
他其他修改操作的途徑, 這樣可以更好的幫助編譯器進行更好的優化程式碼, 生成更有效率的
彙編程式碼。

相關推薦

C語言儲存

儲存類、 作用域、 生命週期、 連結屬性C 語言符號有 3 種連線屬性: 外部連線、 內部連線、 無連線。 記憶體有多種管理方法: 棧、 堆、 資料段、 bss 段、 .text 段······一個變

C語言- 儲存說明符(storage class specifier):typedef

1) 定義一個新的結構型別 1 2 3 4 5 6 7 8 9 10 struct tagMyStruct { int iNum; long lLength;

C語言儲存總結

要理解儲存類,首先要搞清楚如下三個問題:作用域、連結、儲存時期 作用域:描述程式中可以訪問一個識別符號的一個或多個區域。作用域分為:程式碼塊作用域、函式原型作用域、檔案作用域。    (一個檔案內,變數可以被訪問的位置) 對於程式碼塊作用域有一點需要注意,它包括在f

C語言儲存修飾符和型別限定符

儲存類修飾符 宣告中出現的儲存類修飾符(storage class specifier)用於修改識別符號的連結和對應物件的儲存週

c語言構造型之數組_01

字母 水平 需要 部分 示例 例如 one 分號 註意 構造類型--constructed type。至於定義,筆者就省略了,有興趣的同學可以百度搜索https://www.baidu.com/。今天我們要說的是c語言中最簡單的構造類型--數組(array)。 數組用於保存

C語言 各個型占用的大小

c //各個數據類型的大小 #include <stdio.h> int main(int argc, const char * argv[]) { char k; printf("char 占用字節:%d\n",sizeof(k)); int i=0;

C++ 6 儲存

自動 thread 線程 沒有 周期 一個 文件 函數 函數返回值 儲存類:放在變量/函數前,定義範圍和生命周期 auto     根據表達式自動推斷申明的變量類型,申明函數時函數返回值的占位符(函數賦給的值 register   定義在寄存器中(並不意味)的

c語言double型的輸入

2.3 \n 結果 span code 最小 AS tdi std double輸入用 %lf ,而不能用 %f 今天在使用double類型輸入時先用了 scanf("%lf", &a),結果以%f輸出的時候都是0,以%g,%e輸出似乎是最小的double值 12

C語言型限定詞

變量 可變 oct 包含 一個數 sta ans eof 方式 ANSI C 的類型限定詞有const、volatile以及restrict三個,以下分別介紹三個限定詞: 1、類型限定詞const (1)、如果變量中帶有const關鍵字,則該變量無法進行賦值、增量及減量運算

C語言儲存分類

儲存分類用於定義變數的範圍和使用壽命。C語言程式設計中有四個儲存分類。它們分別如下 - auto extern static register 儲存類 儲存地點 預設值 範圍 生命週期

c語言 儲存型別

c中的每一個變數和函式都有兩個屬性:型別(type)和儲存型別(storage class).儲存型別分別是auto(自動),extern(外部),register(暫存器),static(靜態) 1.auto 在函式體中定義的變數預設是auto. 當進入

淺談c#語言,事件,物件,方法和函式的區別

在討論這些關係之前讓我們先來了解一下面向過程和麵向物件的區別: 所謂面向過程就是把一切事物或者需要解決的問題都當做是一個過程來處理,而面向物件則是把一切事物當成一個一個的物件來處理,這兩者有什麼區別呢,舉一個簡單的例子: 編寫一個駕駛汽車的程式: (1)面向過程的程式設計:

c語言儲存管理

/*為二維陣列動態分配記憶體並釋放*/ #include<stdio.h> #include<stdlib.h> int main() { int **pArray2; /*二維陣列指標*/ int iIndex1,iIndex2

C語言儲存模型小議

以下為一C語言程式,下面針對此程式,講一講C語言下該程式如何在記憶體中儲存。int a=0; char*p1; main() { int a,b; char s[]="abc"; char*p2; c

C語言儲存類別

1.作用域 在C語言中,變數的作用域可以是塊作用域、函式作用域、函式原型作用域或檔案作用域 塊作用域 塊是指用一堆花括號括起來的程式碼區域,定義在塊中的變數具有塊作用域,塊作用域變數的可見範圍是

C語言儲存型別

看c專家程式設計,有說儲存型別一直不太清楚。看到一篇文章講解c的儲存型別,講解了c語言中的各種變數的儲存型別,而且是從程序、記憶體的角度講解的,以前從沒有這樣理解過,覺得挺有用的,在這裡轉載過來。 首先要來理解一下可執行檔案載入進記憶體後形成的程序在記憶體中的結構,如下

C語言儲存模式區別、near指標,far指標,huge指標

一、C語言各種儲存模式的區別 DOS用一種段地址結構來編址計算機的記憶體,每一個實體記憶體位置都有一個可通過段地址一偏移量的方式來訪問的相關地址。為了支援這種段地址結構,大多數C編譯程式都允許你用以下6種儲存模式來建立程式: -----------------------

C語言模擬的一個實例

tdi 變量 實的 style ace name 特征 people res #include <stdio.h> #include <stdlib.h> /*用c語言模擬面向對象操作 修改:張亞雄 C語言中的結構體是後來面向對象編程中的類的啟

C語言儲存類別和連結

目錄 C語言儲存類別和連結 儲存類別 儲存期 五種儲存類別 C語言儲存類別和連結 ​ 最近詳細的複習C語言,看到儲存類別的時候總感覺一些概念模糊不清,現在認真的

C語言高階篇 - 3.儲存&作用域&生命週期&連結屬性

1.概念解析 1.1、儲存類         (1)儲存類就是儲存型別,也就是描述C語言變數在何種地方儲存。         (2)記憶體有多種管理方法:棧、堆、資料段、bss段、.text段······一個