1. 靜態局部變量:
#include <stdio.h> //在本地變量定義時加上static修飾符就成為靜態本地變量 //當函數離開的時候,靜態本地變量會繼續存在並保持其值 //靜態本地變量的初始化只會在第一次進入這個函數時做,以后進入函數時會保持上次離開時的值 //靜態本地變量的實質是特殊的全局變量 //靜態本地變量具有全局的生存期,函數內的局部作用域 void f(void) { static int a = 1; //靜態局部變量一般在聲明處初始化,如果沒有顯式初始化,會被程序自動初始化為0(局部變量不會被初始化); //它始終駐留在全局數據區,直到程序運行結束。但其作用域為局部作用域,也就是不能在函數體外面使用它 a += 5; printf("%d\n", a); } int main() { f(); f(); f(); return(0); }
c/c++的內存分布,以及static所在的區間:
對於一個完整的程序,在內存中的分布情況如下圖:
1.棧區: 由編譯器自動分配釋放,像局部變量,函數參數,都是在棧區。會隨着作用於退出而釋放空間
2.堆區:程序員分配並釋放的區域,像malloc(c),new(c++)
3.全局數據區(靜態區):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束釋放
4.代碼區
2.靜態全局變量:
全局變量、靜態全局變量這兩者在存儲方式上並無不同,區別在於非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它
3.靜態函數:
准確的說,靜態函數跟靜態全局變量的作用類似
static函數與普通函數的區別是:用static修飾的函數,限定在本源碼文件中,不能被本源碼文件以外的代碼文件調用。而普通的函數,默認是extern的,也就是說它可以被其它代碼文件調用
定義靜態函數有以下好處:
<1> 其他文件中可以定義相同名字的函數,不會發生沖突。 <2> 靜態函數不能被其他文件所用。