参考中国大学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语言】全局变量、本地变量、静态本地变量(书写规范代码,正确定义变量,防止未知错误)相关推荐

  1. 表变量是什么_DAX学习:使用VAR定义变量

    前面介绍如何使用DAX生成日期表的时候,使用了VAR,有人留言问这个VAR怎么理解,那么这篇文章就来介绍VAR以及它的用法. VAR是VARIABLE的缩写,意思为变量,任何一个编程语言中,变量都是一 ...

  2. keil单片机C语言输入函数,keil编写C程序是不是不能在函数内定义变量啊,求大神...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 肯定可以的:比如 程序动态显示字符 显示光标和光标闪烁打开效果 --------------------------------------------- ...

  3. c语言字节变量怎样定义,C语言之定义变量_wx5c99a1487a5ff的博客的技术博客_51CTO博客...

    基本格式数据类型,标识符 如:int num1,num2,......如需定义多个类型不同的变量,需分别定义标识符定义规则 标识符只能有数字,字母,下划线组成 标识符不能是C语言中定义的关键字,如in ...

  4. 【Linux命令行】使用Linux环境变量:全局变量、局部变量、用户定义变量

    文章目录 什么是环境变量 全局环境变量 局部环境变量 创建自己的局部变量 设置局部用户定义变量 设置全局环境变量 删除环境变量 默认shell环境变量 设置PATH环境变量 定位环境变量 登录shel ...

  5. python定义变量长度_超详细的Python变量的基本使用

    这里是一段防爬虫文本,请读者忽略. 本文原创首发于CSDN,作者IDYS 博客首页:https://blog.csdn.net/weixin_41633902/ 本文链接:https://blog.c ...

  6. python变量在使用前可以不赋值即使用_python定义变量不赋值

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python是一门独特的语言,与c语言有很大区别,初学python很多萌新表示对 ...

  7. php html 变量,PHP与HTML混编,使用PHP变量代替数据--20190221

    语法: 定义变量:$b = value; 输出变量:echo $b; 定义数组:$arr = [key1=>val1,key2=>val2...]; 遍历输出数组: foreach($ar ...

  8. 定义变量时无引号,单引号,双引号区别与特点:

    a=192 a=192-$a b='192-$a' c="192-$a" echo "a=$a" echo "b=$b" echo &quo ...

  9. jmeter如何定位网络延时_JMeter用户定义变量和properties变量高级使用

    Jmeter有个配置元素叫做用户自定义变量(英文名称是UserDefinedVariables)而我们提到的vars即是Variables的简写. 之前我们也说到过Jmeter的脚本中(jsr223s ...

最新文章

  1. 使用Docker的macvlan为容器提供桥接网络及跨主机通讯
  2. Linux的IPC机制(二):Socket/管道/消息队伍/信号量
  3. 引用数据类型的深拷贝
  4. iOS开发常用的第三方
  5. python量化常用_Python量化常用函数
  6. stl swap函数_vector :: swap()函数以及C ++ STL中的示例
  7. Linux下的C编程实战之文件系统编程
  8. 华为4g无线路由器虚拟服务器设置方法,华为4g2pro路由器虚拟服务器设置
  9. 领域应用 | ​英文抗生素药物医学知识图谱 IASO1.0 版发布 线上试用正式启动
  10. 1108. IP 地址无效化
  11. gpu显存(全局内存)在使用时数据对齐的问题
  12. 通向从容之道——Getting things done读书笔记
  13. sqlmap安装与使用
  14. 电脑打印机都正常,打印机无法打印
  15. 一个女程序员的工作感悟
  16. 记录某次利用word邮件功能 由excel数据中批量生成奖状 遇到的问题及解决措施
  17. 如何把excel里面中文小写数字转换成阿拉伯数字
  18. mysql判断纯数字_MYSQL中判断字符串是否为纯数字
  19. 算法学习 - 模拟滤波器(巴特沃斯、贝塞尔、切比雪夫、椭圆)及IIR滤波器设计
  20. 优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads...

热门文章

  1. Oracle date日期类型使用
  2. HTTP,TCP, socket,RPC 与gRPC都是啥?
  3. git如何切换用户_git切换用户、多用户切换的正确方式 git commit和git push 切换用户...
  4. scrapy使用selenium抓取深圳证券交易所考评表数据
  5. CSDN Markdown编辑设置图片大小
  6. 无界面chrome + selenium爬虫
  7. 力扣有没有java_【Java】一篇文章带你玩转用Java刷力扣
  8. 技术文档(3)--查看和修改Linux服务器的时区和时间
  9. toast, 警告窗
  10. js中的cookie