關於C語言變量生存週期、作用域、內存分佈、默認值的基本總結

在C語言中,參與計算的數據都是通過不同類型的常量或者變量來表示的,而使用變量時不得不注意變量的生存週期、作用域,內存區域和默認。在這裏簡單介紹一下內存區域:


代碼段(code segment):通常是指用來存放程序執行的一塊內存區域。這部分區域的大小在程序運行前就已經確定,並且內存區域通常只讀;

(heap):是用於存放進程運行中被動態內存分配的內存段,大小不固定,可擴張或收縮,一般由程序員分配釋放;

(stack):又稱堆棧,是用戶存放程序臨時創建的局部變量,由編譯器自動分配和釋放;

全局(靜態)變量區:通常指用來存放程序中初始化(數據段)和未初始化的全局變量(BSS段);


瞭解了變量的內存區域後,筆者將變量、函數、動態內存的生存週期,內存區域進行對比,得到了下表:



全局變量:定義在函數外的變量,不是屬於某一個函數,而是屬於源程序文件。全局變量分爲普通全局變量和靜態全局變量。

1.普通(靜態)全局變量

生命週期:程序運行時開始創建,程序結束退出銷燬;

作用域:從定義到本文件結束都可以使用;

默認值:0;

內存區域:全局變量區;

這兩者的區別:對於普通全局變量而言,鏈接屬性爲外部,也就是說,它不僅可以自己用,其他文件也可以用“extren”說明符調用。而靜態全局變量是內部,只能在本文件中調用。


局部變量:函數內部聲明的變量,僅在函數內部使用。也分爲普通全局變量和靜態全局變量。

1.普通局部變量

生命週期:進入函數時創建,函數退出時銷燬;
作用域:本函數內部有效
默認值:隨機值;

內存區域:棧;

2.靜態局部變量

生命週期:第一次執行時創建,程序結束銷燬;

作用域:從定義到程序結束;

默認值:0;

內存區域:全局變量區;

這二者只能在局部作用域可見,靜態局部變量超過其作用域便不可被引用。


動態內存
生命週期:程序員調用申請動態內存函數創建,調用釋放函數或程序結束自動銷燬。
默認值:隨機值
內存區域:堆;
普通(靜態)函數
內存區域:代碼段;
這二者差別:靜態函數的鏈接屬性爲內部,普通函數的鏈接屬性爲外部。


參考文獻1:函數、全局變量、局部變量和動態內存的特點歸納

參考文獻2:C++ BSS段、數據段、代碼段、堆與棧及五大內存分區

參考文獻3:C語言變量生存週期

參考文獻4:變量總結

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