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
• 不要使用全局变量来在函数间传递参数和结果
• 尽量避免使用全局变量
• 丰田汽车的案子
• *使用全局变量和静态本地变量的函数是线程不安的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)