一、全域變數
- 定義在函式外面的變數是全域變數
- 全域變數具有全域的生存期和作用域
- 它們與任何函式無關,在任何函式內部都可以使用它們
#include <stdio.h>
int f(void);
// 全域變數
int gALL = 12;
int main(int argc, char const *argv[])
{
printf("in %s gALL=%d\n", __func__,gALL);
f();
printf("agn in %s gALL=%d\n", __func__,gALL);
return 0;
}
int f(void)
{
printf("in %s gALL=%d\n", __func__,gALL);
gALL += 8;
printf("agn in %s gALL=%d\n", __func__,gALL);
return gALL;
}
// in main gALL=12
// in f gALL=12
// agn in f gALL=20
// agn in main gALL=20
二、全域變數初始化
- 沒有做初始化的全域變數會得到0值
- 指標會得到NULL值
- 只能用編譯時刻已知的值來初始化全域變數
- 它們的初始化發生在main函式之前
三、被隱藏的全域變數
如果函式內部存在與全域變數同名的變數,則全域變數被隱藏
#include <stdio.h>
int f(void);
// 全域變數
int gALL = 12;
int main(int argc, char const *argv[])
{
printf("in %s gALL=%d\n", __func__,gALL);
f();
printf("agn in %s gALL=%d\n", __func__,gALL);
return 0;
}
int f(void)
{
// 這里定義一個名字相同的變數,那么全域的就被隱藏了
int gALL = 1;
printf("in %s gALL=%d\n", __func__,gALL);
gALL += 8;
printf("agn in %s gALL=%d\n", __func__,gALL);
return gALL;
}
// in main gALL=12
// in f gALL=1
// agn in f gALL=9
// agn in main gALL=12
四、靜態本地變數
- 在本地變數定義時加上static修飾符就成為靜態本地變數
- 當函式離開的時候,靜態本地變數會繼續存在并保持其值
- 靜態本地變數的初始化只會在第一次進入這個函式時做,以后進入函式時會保持上次離開的值
#include <stdio.h>
int f(void);
int main(int argc, char const *argv[])
{
f();
f();
return 0;
}
int f(void)
{
static int all = 1;
printf("in %s all=%d\n", __func__,all);
all += 9;
printf("agn in %s all=%d\n", __func__,all);
return all;
}
// in f all=1
// agn in f all=10
// in f all=10
// agn in f all=19
注意事項
- 靜態本地變數實際上是特殊的全域變數
- 它們位于相同的記憶體區域
- 靜態本地變數具有全域的生存期,函式內的區域作用域
- static在這里的意思就是區域作用域(本地可以訪問)
五、后記:回傳指標的函式
- 回傳本地變數的地址是危險的
- 回傳全域變數或靜態本地變數的地址是安全的
- 回傳在函式內malloc的記憶體是安全的,但是容易造成問題
- 最好的做法是回傳傳入的指標
下面的寫法就是很危險的
#include <stdio.h>
int* f(void);
void g(void);
int main(int argc, char const *argv[])
{
int *p = f();
printf("*p = %d\n", *p);
g();
printf("*p = %d\n", *p);
return 0;
}
int* f(void)
{
int i = 12;
// 回傳本地變數的地址是危險的
return &i;
}
void g(void)
{
int k = 24;
printf("k = %d\n", k);
}
// *p = 12
// k = 24
// *p = 24
tips
- 不要使用全域變數來在函式間傳遞引數和結果
- 盡量避免使用全域變數
- 使用全域變數和靜態本地變數的函式是執行緒不安全的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/65001.html
標籤:C
上一篇:記憶體靜態和動態分配區別
下一篇:C基本語法
