C語言中變量的存儲方式和生存期

在C語言的一個源文件中從變量的作用域的角度來觀察,變量可分爲全局變量和局部變量(外部變量)

   1、局部變量分量種,一種是函數內部定義的變量,它只能在本函數內使用,此函數外不能使用。另一種是在函數的複合語句(如{}包含的程序塊)中定義變量,它只能在本複合語句內使用,該複合語句外不能使用。

   2、全局變量是在函數之外定義的變量。全局變量可以爲本文件中函數所共用(用extern聲明後也可被外部)。它的有效範圍從定義位置開始到本源文件結束。全局變量在所有函數外定義,在函數內聲明,函數內聲明可以省略。


內存中供用戶使用的存儲空間可分爲3部分

   (1)程序區;

   (2)靜態存儲區,存儲全局變量(包括外部變量)和靜態局部變量等。靜態存儲變量默認初值爲0。

   (3)動態存儲區,存儲函數形式參數、函數中定義的自動變量和函數調用是的現場保護和返回地址等。動態存儲變量初始值不確定。

所以從內存變量值存儲方式來觀察,變量的存儲方式有兩種:靜態存儲方式和動態存儲方式。靜態存取區還分爲棧(由系統分配釋放)和堆(由程序員分配釋放)除了存儲在內存中,有些變量可以存儲在CPU的寄存器中。


C語言的存儲類別有4種:自動的(auto)、靜態的(static)、寄存器的(register)和外部的(extern)。局部變量的存儲類別有:

   (1)、自動變量即動態局部變量(離開函數,變量消失),存儲在內存動態存儲區。函數中的函數如果不聲明爲static都指定爲auto即自動變量。自動變量只在函數被調用時存在,離開函數時則消失。下次調用時分配的內存位置可能不同。

   (2)、靜態局部變量(離開函數,值仍保留),存儲在內存靜態存儲區。函數調用結束時,其佔用的存儲單元不釋放。下次在調用該函數時,該變量以有值。但因爲其爲局部變量,故不能被其他函數引用。

   (3)、寄存器變量(離開函數,值就消失),存儲在CPU中的寄存器。

形式參數可以定義爲自動變量或寄存器變量。


全局變量都存儲在內存靜態存儲區。因此他們存在於整個程序運行過程。但按可引用範圍可分爲

   (1)靜態外部變量(用static聲明,只限本文件使用)

   (2)外部變量(非靜態的外部變量,允許其他文件通過extern引用)。


注意:

(1)在程序中如果局部變量和全局變量同名,全局變量被局部變量屏蔽。

(2)編譯器遇到extern時,先在本文件中找外部變量的定義,如果找到就擴展作用域到本文件。如果找不到就在連接時從其他文件中找外部變量的定義,如果找到就擴展作用域到本文件。如果仍未找到,就按出錯處理。

(3)多局部變量用static聲明,把它分配在靜態存儲區。對全局變量用static聲明,則限制改變量的作用域於本文件。




參考

【1】 譚浩強著. C程序設計(第四版). 北京:清華大學出版社,2010

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