前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言之关键字static

C语言之关键字static

作者头像
Taishan3721
发布2020-01-17 14:32:33
1K0
发布2020-01-17 14:32:33
举报
文章被收录于专栏:这里只有VxWorks

如转发,请标明出处!

C语言的关键字static在有三个作用:声明静态函数,声明静态全局变量,声明静态局部变量

声明静态函数 在函数的返回类型前加个static,就是静态函数了。静态函数只能在声明它的文件中使用,其他文件看不到它。而不同的文件可以使用相同名字的静态函数,互不影响。非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明

声明静态全局变量 全局变量定义在函数体外部,编译器会自动对其初始化。普通全局变量,对整个Kernel可见;而静态全局变量仅对当前文件可见,其他文件不可访问。因此,如果定义的全局变量(或函数)不需要与其他文件共享,建议加上static来降低程序之间的耦合。

声明静态局部变量 局部变量就是函数内部定义的变量,其作用域比全局变量小很多。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。而使用了static的静态局部变量,即使在声明时未赋初值,编译器也会把它初始化为0。而且静态局部变量的存储位置也不同,即使函数返回了,它的值也会保持不变

再看看使用static之后,对存储位置的影响。在VIP中声明不同位置的函数与变量

再把它们的地址与系统内存布局对比一下

得出以下结论:

  • 1 静态函数在Shell里不可见,全局函数在Shell里可见
  • 2 不管哪种函数,都存储于系统的文本段中
  • 3 有初值的全局变量(无论是否静态变量),以及有初值的静态局部变量,存储于系统的数据段中
  • 4 无初值的全局变量(无论是否静态变量),以及无初值的静态局部变量,存储于系统的BSS段中,被初始化为0
  • 5 局部变量(非静态,无论有无初值),存储于任务的栈中。如未赋初值,则使用0xeeeeeeee

留两个问题: 1这个0xeeeeeeee值是怎么来的 2同样的代码,如果是动态加载的(例如使用DKM),那这些变量的地址又如何

我是泰山,专注VX 15年! 一起学习,共同进步!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档