6.1 全局变量

来源:互联网 发布:java开发常见问题 编辑:程序博客网 时间:2024/05/30 04:27

1.全局变量

  • 定义在函数外面的变量
  • 全部变量有 全局的生存期和作用域
    • 它们与任何函数都无关
    • 在任何函数内部都可以使用它们

2.全局变量初始化

  • 没有做初始化的全局变量会得到0值
    • 指针会得到NULL值
  • 只能用编译时刻已知的值来初始化全局变量
  • 它们的初始化发生在main函数之前
#include<stdio.h>int f(void);int gAll;// int gAll = f(); //[Error] initializer element is not constant//int g2 = gAll;//[Error] initializer element is not constant//const int g1 = 12;//int g3 = g1;//[Error] initializer element is not constant//int g4 = g5;// [Error] 'g5' undeclared here (not in a function)//const int g5 = 5;int main(int argc, const char *argv){    printf("gAll = %d\n", gAll); // gAll = 0    return 0;   } int f(){    gAll +=2;}

3.被隐藏的全局变量

  • 函数内部存在 与 全局变量 同名的变量,则全局变量被隐藏
#include<stdio.h>int f(void);int gAll;int main(int argc, const char *argv){    printf("gAll = %d\n", gAll); // gAll = 0    f();    printf("after call f(), gAll = %d\n", gAll); // after call f(), gAll = 0    return 0;   } int f(){    int gAll = 12;    printf("f() gAll = %d\n", gAll); // f() gAll = 12}

4.静态本地变量

  • 在本地变量定义时 加上static修饰符 就成为静态本地变量
  • 当函数离开的时候,静态本地变量会继续存在 并保持其值
  • 静态本地变量的初始化 只会在第一次进入这个函数时做,以后进入函数时 会保值上次离开的值
#include<stdio.h>int f(void);int main(int argc, const char *argv){    f();// in f all = 1    again in f all = 3    f();// in f all = 3    again in f all = 5    return 0;   } int f(){    static int all = 1;    printf("in %s all = %d\n", __func__, all);    all +=2;    printf("again in %s all = %d\n", __func__, all);    return all;}
  • 静态本地变量实际上是特殊的全局变量
  • 它们位于相同的内存区域
  • 静态本地变量 具有全局的生存期,函数内的局部作用域
#include<stdio.h>int f(void);int gAll = 12;int main(int argc, const char *argv){    f();    return 0;   } int f(){    int k = 0;    static int all = 1;    // 从地址看,静态本地变量是 全局的     printf("&gAll=%p\n", &gAll);// &gAll=0000000000403010    printf("&all=%p\n", &all); //   &all=0000000000403014    printf("&k=%p\n", &k);//          &k=000000000022FE1C    printf("in %s all=%d\n", __func__, all); // in f all=1    all += 2;    printf("after +2, in %s all=%d\n", __func__, all); // after +2, in f all=3    return all;}

5. 关于函数输入输出的问题

5.1 返回指针的函数

  • 返回本地变量的地址是危险的
  • 返回全局变量 或 静态本地变量的地址 是安全的
  • 返回在 函数内malloc的内存是安全的,但是容易造成问题
  • 最好的做法是 返回传入的指针
#include<stdio.h>int* f(void);void g(void);int main(int argc, const char *argv){    int *p = f();    printf("*p=%d\n", *p); // *p=12    g(); // k=24    printf("*p=%d\n", *p); // *p=24    return 0;}// 返回本地变量的地址是危险的 int* f(void){    int i = 12;    return &i; // [Warning] function returns address of local variable [-Wreturn-local-addr]}void g(void){    int k = 24;    printf("k=%d\n", k);}

5.2 tips

  • 不要使用全局变量来在函数间传递参数和结果
  • 尽量避免使用全局变量
  • 使用全局变量和静态本地变量的函数 是 线程不安全的
0 0
原创粉丝点击