在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 = &num; 
    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 = &num; 
   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

arrow
arrow
    全站熱搜

    JerryCheng 發表在 痞客邦 留言(0) 人氣()