C语言-变量生存期及作用域
目錄
- 1 變量的生存期和作用域
- 2 默認初始化規則(C++11)
1 變量的生存期和作用域
- 變量的儲存方式:動態儲存(自動、寄存器)、靜態儲存(靜態和外部)
| 自動變量 | anto |
| 寄存器變量 | register |
| 靜態儲存 | static |
| 外部變量 | extern |
- 基本類型的靜態變量(static)系統初始值為 0,全局變量也會自動初始化0
- extern聲明外部變量時,類型名可以寫也可以不寫,如extern int A,B,C,也可以寫成extern A,B,C,因為它不是定義變量,可以不指定類型,只需寫出外部變量名即可。
- 若希望某些外部變量只限于本文件引用,而不能被其他文件引用,可以在定義外部變量時加一個static聲明,如static int A;,那么在其他文件引用extern A就會報錯。
- 對局部變量聲明static,作用是把它分配在靜態內存,它在整個程序執行過程中不會被釋放。對全局變量聲明static,則限定該變量作用域只限于本文件。
- 若要求函數只能被本文件內調用,稱為內部函數,在定義內部函數時,加上static即可。
- 若要定義外部函數,加上extern即可,但C語言默認不加static的就會外部函數,可以被其他文件調用。
-
Stack (棧內存):主要是用來存儲 function calls(函數調用)和 local variables(局部變量) 的空間,其本質就是一個 Stack(棧)。最底層的便是 main() 函數,每調用一個函數時就會執行 push 操作,每當函數 return 時便執行 pop 操作。什么時候 main() 也被 pop 了,整個程序也就結束了。(如果這個 stack 變得太高以至于超出了最大內存地址,就會出現所謂的 stackoverflow)
-
HEAP(堆內存):主要是用來存儲由 malloc() 等申請的內存位置。如果 malloc() 返回 null 的話就往往表示這一塊空間已經用完了。
-
Static (靜態內存):這里的變量的生命周期與整個程序相同,即在進程創建是被申明,在程序退出時被銷毀。global variables(全局作用域變量), file scope variables(文件作用域變量)和被 static 關鍵字修飾的變量會存在這里。
2 默認初始化規則(C++11)
- 棧中的變量(函數體中的自動變量)和堆中的變量(動態內存)會保有不確定的值;
- 全局變量(靜態內存)和靜態變量(包括局部靜態變量,靜態內存)會初始化為零。
C++11: If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2.
總結
以上是生活随笔為你收集整理的C语言-变量生存期及作用域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言-运算符优先级及注意事项
- 下一篇: C语言-动态内存分配总结