| 場景 | 作用 | 關鍵點 |
|---|---|---|
| 修飾局部變量 | 延長生命周期至程序結束,存儲在靜態區 | 僅初始化一次,下次調用保留上次值 |
| 修飾全局變量 | 限制作用域為當前源文件(內部鏈接) | 避免多文件符號衝突 |
| 修飾函數 | 限制作用域為當前源文件(內部函數) | 僅在定義文件可見,配合頭文件暴露公共 API |
// file1.c
int a = 10, b = 20;
// file2.c
extern int a, b; // 聲明
void foo() { printf("%d %d", a, b); }
定義:返回值為指針的函數。語法:返回類型 *函數名(參數列表)
char *SubString(char s[], int i, int j) {
static char temp[100]; // 必須 static,否則棧內存函數返回後失效
int m = 0;
for (int n = i; n <= j; m++, n++) temp[m] = s[n];
temp[m] = '\0';
return temp;
}
// 調用
char *p = SubString("I Love C Language", 2, 9);
printf("%s\n", p); // 輸出 "Love C L"
char *BadSubString(char s[], int i, int j) {
char temp[100]; // 非 static!棧內存,返回指針懸空
// ...
return temp; // 未定義行為
}
口訣:「返回指針指向棟,函數結束棟毀;必須 static 守住地,或由調用者傳緩衝。」
// 更安全:調用者提供緩衝區
void SubStringSafe(char s[], char outBuf[], int i, int j) {
int m = 0;
for (int n = i; n <= j; m++, n++) outBuf[m] = s[n];
outBuf[m] = '\0';
}