引言:
static關鍵字不僅可以修飾變數,而且可以修飾函式。了解它的用法,不僅對閱讀別人的**有幫助,也有助於自己寫出更加健壯的程式。
用法:
用於不同的上下文環境時,static關鍵字具有不同的意義。
(一)
當它用於函式定義時,或用於**塊之外的變數宣告時,static關鍵字用於修改標示符的鏈結屬性,從externl改為internal。但標示符的儲存型別和作用域不受影響。這種方式宣告的函式或變數只能用於宣告它們的原始檔中。
(二)
當它用於**塊內部的變數宣告時,static關鍵字用於修改變數的儲存型別,從自動變數修改為靜態變數,但變數的鏈結屬性和作用域不受影響。用這種方式宣告的變數在程式執行之前建立,並在程式的整個執行期間一直存在,而不是每次在**塊開始執行時建立,在**塊執行完畢後銷毀。
示例解析:
**解釋一:
main.c原始碼
#include #include "test.h"
void main(void)
test.c原始碼
#include static int i = 1;/*宣告為內部變數,只能用於test.c原始檔*/
int j = 2;/*可以作為外部變數使用,在main檔案中用到了*/
static void fun1(void)/*宣告為內部函式,只能用在test.c原始檔中*/
void fun(void)/*可以用在其他檔案中,用在main檔案中*/
test.h原始碼
extern int j;
extern void fun(void);
編譯上面的程式:gcc main.c test.c -o test生成可執行檔案test
執行可執行檔案test顯示結果如下:
i = 1, j = 2//該行是由main函式裡呼叫的test.c檔案中的fun函式生成的
i+1 = 2, j+1 = 3//該行是由test檔案中fun函式呼叫的fun1函式生成的
j = 2//這是由main函式使用外部變數j直接生成的
**解釋二:
test.c原始碼
#include void main(void)
teststatic.c原始碼
#include void main(void)
編譯上面的兩個檔案
gcc test.c -o test
gcc teststatic.c -o teststatic
生成兩個可執行檔案test和teststatic
使用size命令檢視兩個可執行檔案各個段大小:size test teststatic
text data bss dec hex filename
929 264 8 1201 4b1 test
929 268 8 1205 4b6 teststatic
使用static修飾的程式data段更大,因為它在程式執行之前建立,並一直存在到程式執行結束。
補充:
關於作用域儲存型別的解釋,參考:
C語言天天練(二) statickeyword
引言 statickeyword不僅能夠修飾變數。並且能夠修飾函式。了解它的使用方法,不僅對閱讀別人的 有幫助,也有助於自己寫出更加健壯的程式。使用方法 用於不同的上下文環境時,statickeyword具有不同的意義。一 當它用於函式定義時,或用於 塊之外的變數宣告時,statickeyword用...
C語言天天練(十) 結構體
引言 資料經常以成組的形式存在。在c中,使用結構可以把不同型別的值存放在一起。結構的宣告有兩種 1 struct 然後用標籤 去宣告結構體變數。2 typedef struct 然後用 去宣告結構體變數。此時 是個型別名,而不像上面的 是個標籤。結構成員可以是標量 陣列 指標甚至是其他結構。結構成員...
C語言天天練(二四) 記憶體分配
引言 對於c語言程式,了解它執行時在記憶體中是怎樣分配的對於我們理解它的執行機制是很實用的。以下就總結一下c語言程式的一些記憶體分配知識。一 一段c程式。編譯連線後形成的可執行檔案一般有 段 資料段 堆和棧等幾部分組成。當中資料段又包含僅僅讀資料段 已初始化的讀寫資料段和未初始化的bss段。例如以下...