C語言存儲類型理解

    複習存儲類型的時候看到一篇文章是從內存分配 角度來介紹C語言存儲類型的,可以學習下。C語言中的存儲類型有auto, extern, register, static 這四種,可以一個一個看。


     首先要來理解一下可執行文件加載進內存後形成的進程在內存中的結構,如下圖:


代碼區:存放CPU執行的機器指令,代碼區是可共享,並且是隻讀的。

數據區:存放已初始化的全局變量、靜態變量(全局和局部)、常量數據。

BBS區:存放的是未初始化的全局變量和靜態變量。

棧區:由編譯器自動分配釋放,存放函數的參數值、返回值和局部變量,在程序運行過程中實時分配和釋放,棧區由操作系統自動管理,無須程序員手動管理。

堆區:堆是由malloc()函數分配的內存塊,使用free()函數來釋放內存,堆的申請釋放工作由程序員控制,容易產生內存泄漏。


C語言

中的存儲類型有auto, extern, register, static 這四種,存儲類型說明了該變量要在進程的哪一個段中分配內存空間,可以爲變量分配內存存儲空間的有數據區、BBS區、棧區、堆區。下面來一一舉例看一下這幾個存儲類型:

1. auto存儲類型

auto只能用來標識局部變量的存儲類型,對於局部變量,auto是默認的存儲類型,不需要顯示的指定。因此,auto標識的變量存儲在棧區中。


2. extern存儲類型

extern用來聲明在當前文件中引用在當前項目中的其它文件中定義的全局變量。如果全局變量未被初始化,那麼將被存在BBS區中,且在編譯時,自動將其值賦值爲0,如果已經被初始化,那麼就被存在數據區中。全局變量,不管是否被初始化,其生命週期都是整個程序運行過程中,爲了節省內存空間,在當前文件中使用extern來聲明其它文件中定義的全局變量時,就不會再爲其分配內存空間。


3. register存儲類型

聲明爲register的變量在由內存調入到CPU寄存器後,則常駐在CPU的寄存器中,因此訪問register變量將在很大程度上提高效率,因爲省去了變量由內存調入到寄存器過程中的好幾個指令週期。


4. static存儲類型被聲明爲靜態類型的變量,無論是全局的還是局部的,都存儲在數據區中,其生命週期爲整個程序,如果是靜態局部變量,其作用域爲一對{}內,如果是靜態全局變量,其作用域爲當前文件。靜態變量如果沒有被初始化,則自動初始化爲0。靜態變量只能夠初始化一次。


5. 字符串常量

字符串常量存儲在數據區中,其生存期爲整個程序運行時間,但作用域爲當前文件



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章