C語言的內存分配方式:堆和棧

C語言 編譯器 程序員 算法集市 2019-06-27
C語言的內存分配方式:堆和棧

在 C 語言中,內存分配方式有以下三種形式:

1、從靜態存儲區域分配

由編譯器自動分配和釋放,在程序編譯的時候就已經分配好內存,這塊內存在程序的整個運行期間都存在,直到整個程序運行結束時才被釋放,如全局變量與 static 變量。

C語言的內存分配方式:堆和棧

2、在棧上分配

同樣由編譯器自動分配和釋放,在函數執行時,函數內部的局部變量都可以在棧上創建,函數執行結束時,這些存儲單元將則被自動釋放。

需要注意的是,棧內存分配運算內置於處理器的指令集中,它的運行效率一般很高,但是分配的內存容量有限。

C語言的內存分配方式:堆和棧

3、從堆上分配

也稱為動態內存分配,由程序員手動完成申請和釋放。程序在運行的時,由程序員使用內存分配函數(如 malloc 函數)來申請內存,使用完之後再由程序員自己負責使用內存釋放函數(如 free 函數)來釋放內存。

需要注意的是,如果在堆上分配了內存空間,就必須及時釋放它,否則將會導致運行的程序出現內存洩漏等錯誤。

在 C 語言中,不同類型變量的存儲位置和作用域也有所不同。

全局變量

從靜態存儲區域分配,其作用域是全局作用域,也就是整個程序的生命週期內都可以使用。如果程序是由多個源文件構成的,那麼全局變量只要在一個文件中定義,就可以在其他所有的文件中使用,但必須在其他文件中通過使用extern關鍵字來聲明該全局變量。

全局靜態變量

從靜態存儲區域分配,其生命週期也是與整個程序同在的,從程序開始到結束一直起作用。與全局變量不同的是,全局靜態變量作用域只在定義它的一個源文件內,其他源文件不能使用。

局部變量

從棧上分配,其作用域只是在局部函數內,在定義該變量的函數內,只要出了該函數,該局部變量就不再起作用,也即該變量的生命週期和該函數同在。

局部靜態變量

從靜態存儲區域分配,其在第一次初始化後就一直存在直到程序結束。該變量的特點是其作用域只在定義它的函數內可見,出了該函數就不可見了。

C語言的內存分配方式:堆和棧

相關推薦

推薦中...