標籤:
全域變數
定義在函數外面的變數是全域變數
全域變數具有全域的生存期和範圍
它們與任何函數無關
在任何函數內部都可以使用它們
#include <stdio.h>int f(void);int gAll = 12;int main(){ printf("gAll in %s function is %d\n",__func__,gAll); //注意:__func__是輸出是哪個函數,底線是兩個連著一起 f(); printf("gAll again in %s function is %d\n",__func__,gAll); return 0;}int f(){ printf("gAll in %s function is %d\n",__func__,gAll); gAll += 2; printf("gAll again in %s function is %d\n",__func__,gAll); return gAll;}
沒有做初始化的全域變數會得到0值
指標會得到NULL值
只能用編譯時間刻已知的值來初始化全域變數
它們的初始化發生在main函數之前
如果函數內部存在與全域變數同名的變數,則全域變數被隱藏。
靜態本地變數
在本地變數定義時加上static修飾符就變成靜態本地變數
在函數離開的時候靜態本來變數會繼續存在並保持其值
靜態本地變數的初始化只有第一次進入這個函數的時候做,以後進入這個函數保持上次離開時的值
靜態本地變數實際上是特殊的全域變數
它們位於相同的記憶體地區
靜態本地變數具有全域的生存期,函數內部的局部範圍。
static在這裡的意思是局部範圍(本地可以訪問)
還回指標的函數
返回本地變數的地址是危險的
返回全域變數或靜態本地變數的地址是安全的
返回在函數內malloc的記憶體是安全的,但是容易造成問題
最好的做法是返回傳入的指標
tips
不要使用全域變數來在函數間傳遞參數和結果
盡量避免使用全域變數
使用全域變數和靜態本地變數的函數是線程不安全的
The End
Thank you !
C語言學習--全域變數、靜態本地變數