1.從靜態存儲區分配
由編譯器自動分配和釋放,內存在程序編譯時就已經分配好了。這種內存存在於程序的整個運行期,直到整個程序結束才釋放,比如全局變量和靜態變量。
2.在堆棧上分配
它也由編譯器自動分配和釋放。函數執行時,可以在棧上創建函數內部的局部變量,函數執行時,這些存儲單元會自動釋放。
需要註意的是,堆棧內存分配操作內置於處理器的指令集中,其運行效率壹般較高,但分配的內存容量有限。
3.從堆中分配
也稱為動態內存分配,由程序員手動完成申請和釋放。程序運行時,程序員使用內存分配函數(如malloc函數)申請內存,然後程序員負責使用內存釋放函數(如free函數)釋放使用後的內存。
需要註意的是,如果在堆上分配了內存空間,壹定要及時釋放,否則會導致運行程序出現內存泄漏等錯誤。
在C語言中,不同類型變量的存儲位置和範圍也是不同的。
全局變量
從靜態存儲區分配,它的作用域是全局作用域,這意味著它可以在程序的整個生命周期中使用。如果程序由多個源文件組成,那麽只要在壹個文件中定義了全局變量,它就可以在所有其他文件中使用,但是必須使用extern關鍵字在其他文件中聲明它。
全局靜態變量
從靜態存儲區的分配來看,它的生命周期也是伴隨著整個程序的,從程序開始到結束壹直有效。與全局變量不同,全局靜態變量的作用域只在定義它的壹個源文件中,不能使用其他源文件。
局部變量
從堆棧中分配,它的作用域只在局部函數中。在定義變量的函數中,只要函數出了,局部變量就不再起作用,也就是變量的生命周期和函數在壹起。
局部靜態變量
從靜態存儲區分配,靜態存儲區在第壹次初始化後壹直存在,直到程序結束。這個變量的特點是,它的作用域只在定義它的函數中可見,在函數外不可見。