內(nèi)存中的程序
- 只讀部分
- 程序中的代碼
- 程序中的常量
- 可讀寫部分
- .data: 初始化了的全局變量和靜態(tài)變量
- .bss(Block Started by Symbo):未初始化的全局變量和靜態(tài)變量
- heap: 使用 malloc, realloc, 和 free 函數(shù)控制的變量
- stack: 函數(shù)調(diào)用時使用棧來保存函數(shù)現(xiàn)場,自動變量
靜態(tài)變量 & 全局變量
全局變量:代碼中的變量,要么定義在函數(shù)外,要么定義在函數(shù)里。定義在函數(shù)外的變量就有了全局的作用域,成了全局變量,全局變量不僅在整個文件中有作用,而且在其他文件中也有作用,稱作鏈接性。
a.c
#include <stdio.h>
int a;
int compute(void);
int main()
{
a = 1;
printf("%d %d\n", a, compute());
return 0;
}
b.c
int a;
int compute(void)
{
a = 0;
return a;
}
在鏈接過程中會產(chǎn)生重復(fù)定義錯誤,原因是有兩個全局變量a,為了避免這種情況,需要引入static。
靜態(tài)變量:指使用 static 關(guān)鍵字修飾的變量,static 關(guān)鍵字對變量的作用域進行了限制,使得變量僅在源文件內(nèi)有效。
- static在函數(shù)外:static全局變量
- static在函數(shù)內(nèi):static局部變量
對于static局部變量,在其他文件調(diào)用本文件內(nèi)函數(shù)修改其值時候,變量的值不會丟失;普通局部變量都是重新分配,而靜態(tài)局部變量保持上次調(diào)用的值不變。
注意:'靜態(tài)'這個中文翻譯實在是有些莫名其妙,給人的感覺像是不可改變的,而實際上 static 跟不可改變沒有關(guān)系,不可改變的變量使用 const 關(guān)鍵字修飾,注意不要混淆。