#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
若是函數內部存在與全局變量同名的變量,則全局變量被隱藏安全
#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
#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
下面的寫法就是很危險的函數
#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