在C中 , static是一個Storage-class specifiers,
它的主要作用有兩個,一個是作用域的限制,一個是指定存儲方式。
在作用域限制上:
以static申明的global variable、function不得被其他文件所引用.
#include <string.h>
static int num = 10;
int mynum = 100;
static int str_len(char *str)
{
return strlen(str);
}
int mystr_len(char *str)
{
return str_len(str) + num;
}
當你mystr.c文件中的str_len函數加上了static關鍵字,你便不能在其他的地方復用這個函數,譬如,你不能這樣寫:
//這是main.c 的內容
#include <stdio.h>
int main()
{
int len;
len = str_len("hello, world\n");
printf("%d %d\n", num, len ) ;
return 0;
}
gcc main.c mystr_len.c
將不能編譯通過,因為mystr.c中的num變量和str_len函數都用了static關鍵字,導致他們只能在mystr.c中被使用,如文件中的mystr_len函數可以引用num變量和str_len函數。
而在指定存儲方式上:
int *test()
{
int num = 100;
int *ptr = #
return ptr;
}
int main()
{
printf("%d\n", *test);
return 0;
}
該函數返回整數num的pointer,在main函數中打印*test將會出現段錯誤,因為num做為test函數內部,只能在test內部被訪問。以下程序是正確的。
int *test()
{
static int num = 100;
int *ptr = #
return ptr;
}
int main()
{
printf("%d\n", *test);
return 0;
}
該程序中num變量加了關鍵字static,函數運行結束後,依然可以在其他地方被引用,只是不能直接通過變量名訪問,而要間接通過指針訪問,原因是 static變量存儲在全局數據段中而不是函數棧中。讀者可以將它看作特殊的全局變量,只是其他地方只能通過 pointer 來訪問,而不能直接通過變量名訪問。
ref : http://www.lslnet.com/linux/f/docs1/i03/big5121761.htm