C语言学习全局变量

Posted guoweilf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习全局变量相关的知识,希望对你有一定的参考价值。

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

二.全局变量初始化
• 没有做初始化的全局变量会得到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);  //__func__打印函数名字 
    f();
    printf("agn in %s gAll=%d\\n",__func__,gAll);
    return 0;


int f(void)

    printf("in %s gAll=%d\\n",__func__,gAll);
    gAll +=2;
    printf("agn in %s gAll=%d\\n",__func__,gAll);
    return gAll;

技术图片

 

 

被隐藏的全局变量
• 如果函数内部存在与全局变量同名的变量,则全局变量被隐藏

三.静态本地变量
• 在本地变量定义时加上static修饰符就成为静态本地变量

• 当函数离开的时候,静态本地变量会继续存在并保持其值

• 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值

• 静态本地变量实际上是特殊的全局变量
• 它们位于相同的内存区域
• 静态本地变量具有全局的生存期,函数内的局部作用域

• static在这里的意思是局部作用域(本地可访问)

#include  <stdio.h>

int f(void);

int gAll =12;

int main(int argc,char const *argv[])

    f();
//    f();
//    f();
    return 0;

int f(void)

    int k =0;
    static int all =1;
    printf("&gAll=%p\\n",&gAll);
    printf("&all=%p\\n",&all); //静态本地变量 其实就是特殊的全局变量 
    printf("&k=%p\\n",&k);
    printf("in %s all=%d\\n",__func__,all);
    all +=2;
    printf("agn in %s all =%d\\n",__func__,all);
    return all;

技术图片

 

 

 四.*返回指针的函数
• 返回本地变量的地址是危险的
• 返回全局变量或静态本地变量的地址是安全的
• 返回在函数内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;
    printf("&i=%p\\n",&i); 
    return &i;
    


void g(void)

    int k=24;
    printf("&k=%p\\n",&k); 
    printf("k=%d\\n",k);

技术图片

 

 

 tips
• 不要使用全局变量来在函数间传递参数和结果
• 尽量避免使用全局变量
• 丰田汽车的案子
• *使用全局变量和静态本地变量的函数是线程不安的

以上是关于C语言学习全局变量的主要内容,如果未能解决你的问题,请参考以下文章

c语言工程里其它文件引用全局变量?

怎么在汇编中引用c语言的全局变量

c语言,关于全局变量。拜托了各位 谢谢

C语言之变量作用域

C语言 全局变量和局部变量区别

C语言中,宏替换与定义全局变量的区别是啥?