全局變量
作用域:全局作用域(全局變量只需在一個源文件中定義,就可以作用於所有的源文件。)
生命週期:程序運行期一直存在
引用方法:其他文件中要使用必須用extern 關鍵字聲明要引用的全局變量。
內存分佈:全局數據區
注意:如果在兩個文件中都定義了相同名字的全局變量,連接出錯:變量重定義
全局靜態變量
作用域:文件作用域(只在被定義的文件中可見。)
生命週期:程序運行期一直存在
內存分佈:全局數據區
定義方法:static關鍵字,const 關鍵字
注意:只要文件不互相包含,在兩個不同的文件中是可以定義完全相同的兩個靜態變量的,它們是兩個
完全不同的變量
靜態局部變量
作用域:局部作用域(只在局部作用域中可見)
生命週期:程序運行期一直存在
內存分佈:全局數據區
定義方法:局部作用域用中用static定義
注意:只被初始化一次,多線程中需加鎖保護
int fac(int n)
{
static int nRet = 1; //靜態局部變量
nRet *= n;
return nRet;
}
int main()
{
for(int i=1;i<5;i++)
{
printf("%d!=%d\n",i,fac(i));
}
getchar();
return 0;
}
結果:
局部變量
作用域:局部作用域(只在局部作用域中可見)
生命週期:程序運行出局部作用域即被銷燬
內存分佈:棧區
注意:auto指示符標示
int fac(int n)
{
int nRet = 1; //靜態局部變量
nRet *= n;
return nRet;
}
int main()
{
for(int i=1;i<5;i++)
{
printf("%d!=%d\n",i,fac(i));
}
getchar();
return 0;
}
結果:
函數中在堆中開闢內存:
0.申請方式和回收方式不同
堆和棧的第一個區別就是申請方式不同:棧(英文名稱是stack)是系統自動分配空間的,例如我們定義
一個 char a;系統會自動在棧上爲其開闢空間。而堆(英文名稱是heap)則是程序員根據需要自己申請
的空間,例如malloc(10);開闢十個字節的空間。
由於棧上的空間是自動分配自動回收的,所以棧上的數據的生存週期只是在函數的運行過程中,運行後
就釋放掉,不可以再訪問。而堆上的數據只要程序員不釋放空間,就一直可以訪問到,不過缺點是一旦
忘記釋放會造成內存泄露。還有其他的一些區別我認爲網上的朋友總結的不錯這裏轉述一下:
參考:http://blog.csdn.net/yunyun1886358/article/details/5632087
http://100926.blog.sohu.com/189515489.html