全局與靜態(tài)的博弈

內(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)鍵字修飾,注意不要混淆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容