【C语言】全局变量、本地变量、静态本地变量(书写规范代码,正确定义变量,防止未知错误)
参考中国大学MOOC 浙江大学翁恺C语言程序设计在线课程
作用域:一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
生存期:从对象分配到内存开始,到垃圾回收器从内存中删除对象结束这一段时间。即对象的存在时间。
全局变量初始化
- 没有做初始化的全局变量会得到0值
- 指针会得到NULL值
- 只能⽤编译时刻已知的值来初始化全局变量
- 它们的初始化发⽣在main函数
C语言中尽量少用全局变量可用static修饰本地变量(静态本地变量)来代替。
静态本地变量(特殊的全局变量)
- 在本地变量定义时加上static修饰符就成为静态本地变量
- 当函数离开的时候,静态本地变量会继续存在并保持其值
- 静态本地变量的初始化只会在第⼀次进⼊这个函数时做,以后进⼊函数时会保持上次离开时的值
- 静态本地变量实际上是特殊的全局变量
- 它们位于相同的内存区域
- 静态本地变量具有全局的⽣存期,函数内的局部作⽤域
- static在这⾥的意思是局部作⽤域(本地可访问)
#include <stdio.h>int gAll;void f()
{static int i;int k;printf("%p\n", &gAll);printf("%p\n", &i);printf("%p\n", &k);
}int main(int argc, char const *argv[])
{f();return 0;
}
VS2010中运行结果如下:
不难看出第一个地址和第二个地址之间相差4即4个字节(一个int型变量占4个字节)也就是说两者的内存区域是紧挨着的,也就是静态本地变量就是一个特殊的全局变量。
返回指针的函数
- 返回本地变量的地址是危险的
- 返回全局变量或静态本地变量的地址是安全的
- 返回在函数内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(); //此时f函数中本地变量i的内存已经被回收并且分配给了g函数中的k,但指针变量p仍然指向原来i(现在k)的地址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);}
VS2010中运行结果如下:
【C语言】全局变量、本地变量、静态本地变量(书写规范代码,正确定义变量,防止未知错误)相关推荐
- 表变量是什么_DAX学习:使用VAR定义变量
前面介绍如何使用DAX生成日期表的时候,使用了VAR,有人留言问这个VAR怎么理解,那么这篇文章就来介绍VAR以及它的用法. VAR是VARIABLE的缩写,意思为变量,任何一个编程语言中,变量都是一 ...
- keil单片机C语言输入函数,keil编写C程序是不是不能在函数内定义变量啊,求大神...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 肯定可以的:比如 程序动态显示字符 显示光标和光标闪烁打开效果 --------------------------------------------- ...
- c语言字节变量怎样定义,C语言之定义变量_wx5c99a1487a5ff的博客的技术博客_51CTO博客...
基本格式数据类型,标识符 如:int num1,num2,......如需定义多个类型不同的变量,需分别定义标识符定义规则 标识符只能有数字,字母,下划线组成 标识符不能是C语言中定义的关键字,如in ...
- 【Linux命令行】使用Linux环境变量:全局变量、局部变量、用户定义变量
文章目录 什么是环境变量 全局环境变量 局部环境变量 创建自己的局部变量 设置局部用户定义变量 设置全局环境变量 删除环境变量 默认shell环境变量 设置PATH环境变量 定位环境变量 登录shel ...
- python定义变量长度_超详细的Python变量的基本使用
这里是一段防爬虫文本,请读者忽略. 本文原创首发于CSDN,作者IDYS 博客首页:https://blog.csdn.net/weixin_41633902/ 本文链接:https://blog.c ...
- python变量在使用前可以不赋值即使用_python定义变量不赋值
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python是一门独特的语言,与c语言有很大区别,初学python很多萌新表示对 ...
- php html 变量,PHP与HTML混编,使用PHP变量代替数据--20190221
语法: 定义变量:$b = value; 输出变量:echo $b; 定义数组:$arr = [key1=>val1,key2=>val2...]; 遍历输出数组: foreach($ar ...
- 定义变量时无引号,单引号,双引号区别与特点:
a=192 a=192-$a b='192-$a' c="192-$a" echo "a=$a" echo "b=$b" echo &quo ...
- jmeter如何定位网络延时_JMeter用户定义变量和properties变量高级使用
Jmeter有个配置元素叫做用户自定义变量(英文名称是UserDefinedVariables)而我们提到的vars即是Variables的简写. 之前我们也说到过Jmeter的脚本中(jsr223s ...
最新文章
- 使用Docker的macvlan为容器提供桥接网络及跨主机通讯
- Linux的IPC机制(二):Socket/管道/消息队伍/信号量
- 引用数据类型的深拷贝
- iOS开发常用的第三方
- python量化常用_Python量化常用函数
- stl swap函数_vector :: swap()函数以及C ++ STL中的示例
- Linux下的C编程实战之文件系统编程
- 华为4g无线路由器虚拟服务器设置方法,华为4g2pro路由器虚拟服务器设置
- 领域应用 | ​英文抗生素药物医学知识图谱 IASO1.0 版发布 线上试用正式启动
- 1108. IP 地址无效化
- gpu显存(全局内存)在使用时数据对齐的问题
- 通向从容之道——Getting things done读书笔记
- sqlmap安装与使用
- 电脑打印机都正常,打印机无法打印
- 一个女程序员的工作感悟
- 记录某次利用word邮件功能 由excel数据中批量生成奖状 遇到的问题及解决措施
- 如何把excel里面中文小写数字转换成阿拉伯数字
- mysql判断纯数字_MYSQL中判断字符串是否为纯数字
- 算法学习 - 模拟滤波器(巴特沃斯、贝塞尔、切比雪夫、椭圆)及IIR滤波器设计
- 优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads...
热门文章
- Oracle date日期类型使用
- HTTP,TCP, socket,RPC 与gRPC都是啥?
- git如何切换用户_git切换用户、多用户切换的正确方式 git commit和git push 切换用户...
- scrapy使用selenium抓取深圳证券交易所考评表数据
- CSDN Markdown编辑设置图片大小
- 无界面chrome + selenium爬虫
- 力扣有没有java_【Java】一篇文章带你玩转用Java刷力扣
- 技术文档(3)--查看和修改Linux服务器的时区和时间
- toast, 警告窗
- js中的cookie