變量可以被static 修飾,意義有發生變化嗎?
下面我們舉個栗子來說明:
(1)變量不加 static 修飾
#include <stdio.h>
void test()
{
int num = 0;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
(2)變量被 static 修飾
#include <stdio.h>
void test()
{
static int num = 0;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
總結:
- 不加static修飾,函數或者代碼塊中的變量在函數或者代碼塊執行完畢後就直接回收銷燬了,每次執行都會重新分配內存,每次都會銷燬。
- 加 static 修飾,函數或者代碼塊中的變量在函數或者代碼塊執行第一次初始化分配內存後,就算函數或者代碼塊執行完畢,該變量也不會被回收 銷燬,直到程序結束 static 變量纔會被回收。
- 當 static 作用於函數定義時,或者用於代碼塊之外的變量聲明時,static關鍵字用於修改標識符的鏈接屬性。外部鏈接屬性變爲內部鏈接屬性,標識符的存儲類型和作用域不受影響。也就是說變量或者函數只能在當前源文件中訪問,不能在其他源文件中訪問。
- 當static 作用於代碼塊內部的變量聲明時,static關鍵字用於修改變量的存儲類型。從自動變量變爲靜態變量,變量的屬性和作用域不受影響。
特點:
static局部變量的”記憶性”與生存期的”全局性”
所謂”記憶性”是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.
注意事項:
1. “記憶性”, 程序運行很重要的一點就是可重複性, 而static變量的”記憶性”破壞了這種可重複性, 造成不同時刻至運行的結果可能不同.
2. “生存期”全局性和唯一性. 普通的local變量的存儲空間分配在stack上, 因此每次調用函數時, 分配的空間都可能不一樣, 而static具有全局唯一性的特點, 每次調用時, 都指向同一塊內存, 這就造成一個很重要的問題 —— 不可重入性