原标题:C语言 static 声明静态变量?大佬原来用它干这事!

C语言可变参数只会用算啥本事?看我来抽丝剥茧干翻它!

高手在写代码的时候,会特别注重的一点就是,对外的方法对外,不对外的方法和数据,都是让其对外不可见,也就是俗称的,内部不想让别人直接访问的方法,变量,就不要让其可以访问到,从而保证几点:

1 不污染全局符号

2 数据和方法保证不被不规范的引用

而C语言中的关键字 static 就是起这个作用,我们这节来讲讲这个玩意。再说这个前,我想跟大家先讲一个内容,之前也说过。

代码段

数据段

BSS段

代码段是只读区域,这个段落不允许修改,加载时候会指定只读。

数据段分为,只读区域和可变区域。只读区域就是类似于常量数据,还有常量字符串这些,同时还有一些使用const 关键字修饰的,会放到这里,标记只读,保证数据不会被随意修改。

BSS段放置的是全局的未初始化的变量,这个编译成可执行文件因为没有初始化数据,所以可执行文件中就不占大小,但是如果初始化了,就会占大小。

堆,我们使用 malloc 申请内存空间,就是在这个区域,这个区域是需要主动去释放空间,否则会内存泄漏。

栈,函数内部的局部变量,以及函数之间调用,临时使用的空间,这个是依赖栈的压入,弹出机制,重复在用。(这里用一个网上图片,大家一目了然)

栈我们一般不用关注,它会自动平衡,但是我们一般在栈里面要考虑的就是栈溢出。栈也是有大小的,系统会分配一段区域,用在压栈,弹出操作,如果你两个函数相互调用,就会出现栈溢出。

为什么要说这个?其实就是因为 static 关键字,有一个功能,就是会让局部变量本该在栈上,用这个声明后,就会进入全局区域,也就是从栈区域,进入到数据区域。

下面我们来看下代码:add.c

hello.c

我们这里看下,没有#include “add.h”, 我们使用

gcc -o add.o -c add.c

gcc -o hello.o -c hello.c

gcc -o hello hello.o add.o

发现是可以编译过,也能链接过,也能运行。我们使用readelf-sadd.o ,看到信息,add前面有个Bind的值是GLOBAL,这个就是说明,add是在可以让其他.o链接时候去查找的一个符号,它的类型是func函数。

然后我们把add.c 改成这个:(前面加上一个static)

编译链接就会失败,找不到add方法,那么我们readelf -s add.o再看下:

add前面Bind的值变成了LOCAL,这时候对外就不可见了。这也就是static在全局的时候,起的作用,将对应的变量,或者函数的可见范围,变成只对自身可见,对外不可见。

这个是为了降低重名的几率,也是防止自身的全局变量被外部访问,瞎修改的风险。

为了说明这个情况,我们来演示下这个过程,add.c改成这样:

hello.c 改成

编译执行后,最终结果输出17,是不是让我们一下子就不明白,a b两个值被外部随意修改,导致没法看懂代码业务。

我们看到有两个类型是 OBJECT 的数据,全局的,a和b。这样子这两个值就是可以被外部引用,进行修改的了。

如果我们把 add.c 中的 int a=5;改成static int a=5;那么最终链接的时候hello.o 就找不到a变量,导致链接失败。

这也就是static的作用,让只想对当前的.c能访问,做的对修饰的变量或者函数进行限定。

于是,我们常规的模式就是,对内的都用static进行修饰,然后放出对外函数,让其操作数据,保证入口的统一性,也更容易追踪。具体如下:

用静态修饰变量,不让外部直接访问,然后对外放出函数,让其通过函数修改数据,保证了入口的唯一性,这样子调试也很简单,直接在函数设置断点,打印堆栈,直接能找到调用方。

而如果说你让int a这种随意的变量放置到全局,就是一个灾难,会出现莫名奇妙被修改,找半天找不到被谁修改的问题。

说完了全局变量,全局函数前面加static,下来说下函数内部,添加static的妙用。

函数中的局部变量,默认是都在栈上面,这类变量最大的特点就是,函数返回之后,这段区域就会被其他函数调用时覆盖,重复利用,这也是栈的特点。

那么如果我们想做一个记数,用来记录这个 add 函数被调用的次数。该如何设计呢?

我们可以用一个全局静态变量来记录,比如 static int call_add_times=0;

然后在add方法里面进行记数,这样来操作。

这样子不舒服的一点就是,本该是在add内部的一个变量,被丢到全局区域,这样子就会有个问题,会被本文件的其他地方调用,但我们设计的这个变量,只想让add函数用。

于是,我们可以这样子处理:

int add

{

static int call_add_times=0;

call_add_times++;

return a+b;

}

这样子操作后, call_add_times就会从栈区域进到全局变量区域,但是又能保证只对add函数可见,其他函数都调用不到。

你说,妙哉否?

我们在学习一些语言,技巧的时候,尽量要去思考它的使用场景,这样子的话,你就知道,它的每个设计,都是为了解决一类问题,也就是需求推动设计。

好了,今天就说的这里,不知道你学的开心不开心?下一节我们来说下,关于inline 关键字的用法,这个比较简单,我们下一节见!返回搜狐,查看更多

责任编辑:

c语言staticint的作用,C语言 static 声明静态变量?大佬原来用它干这事!相关推荐

  1. C语言 static 声明静态变量?大佬原来用它干这事!

    C语言可变参数只会用算啥本事?看我来抽丝剥茧干翻它! 高手在写代码的时候,会特别注重的一点就是,对外的方法对外,不对外的方法和数据,都是让其对外不可见,也就是俗称的,内部不想让别人直接访问的方法,变量 ...

  2. c语言info函数作用,c语言解析系列(4)函数

    E函数 函数只要"有一个接口,一个出口",就可以把复杂的程序连接起来.它为程序化大为小,实现模块化,避免了程序的繁长,为团队之间协作完成某一复杂的工程提供了便利的途径,高效快捷,既 ...

  3. static(静态变量,方法)

    static(静态变量,方法) 文章是作者面向对象文章的单独拆分如果存在阅读不连续性请参考下文 Java面向对象 完整代码 是什么? 静态的变量与方法不属于对象,而是属于类 我们常说的类变量.类方法( ...

  4. c语言staticint的作用,c语言中static是什么意思?作用是什么

    c语言中static是什么意思?作用是什么 发布时间:2020-04-30 10:07:02 来源:亿速云 阅读:290 作者:小新 今天小编给大家分享的是c语言中static是什么意思?作用是什么, ...

  5. static在c语言中的作用_C语言关键字 static 的用法

    接上文:C语言的32个关键字 C语言 static 关键字的常见用法有三种: 用于局部变量的修饰符: 用于全局变量的修饰符: 用于函数的修饰符. 1.用于局部变量的修饰符 当 static 用于修饰局 ...

  6. c语言fun的作用,c语言fun函数有什么作用

    c语言fun函数有什么作用 c语言fun函数的作用是被主函数所调用,来定义一个函数或方法,这样在引用时可以用fun表示,比如[int fun(int x,int y)]. c语言fun函数的作用是: ...

  7. C语言文件缓冲区作用,C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲...

    //文件结构体FILE的理解以及缓冲区再讲 #include #include //要点:文件结构 //struct _iobuf { // char *_ptr; ------当前缓冲区内容指针 / ...

  8. %2d在c语言中什么作用,C语言中的 %2d是什么意思

    修饰符格式说明.意义M%md以宽度m输出整型数,不足m时,左补空格0m%0md以宽度m输出整型数,不足m时,左补零m,n%m.nf以宽度m输出实型小数,小数位为n位例如:设i=123,a=12.345 ...

  9. c语言 const常量作用,C语言 const常量讲解

    //const的本质 //const本质上是伪常量,无法用于数组初始化以及全局变量初始化 //原因在于const仅仅限定变量无法直接赋值,但是却可以通过指针间接赋值 //例如局部常量在栈区,而不在静态 ...

最新文章

  1. 线性回归、逻辑回归及SVM
  2. 云计算之路-阿里云上:RDS用户的烦恼
  3. c#分布式ID生成器
  4. 文件管理服务器主机,通过BlueHost主机文件管理器上传文件
  5. OSPF-LSA数据包头
  6. 当前深度神经网络模型压缩和加速都有哪些方法?
  7. 计算机word一体化教案,【计算机应用基础】word教案.doc
  8. 关于android 调用网页隐藏地址栏
  9. oracle函数总结
  10. SAP License:做顾问要有一颗平常心
  11. 最懂基金经理的第三方机构猫头鹰,到底是谁?
  12. 2021计算机二级圆锥题,2021年计算机二级考试真题以及答案
  13. 联想P340加显卡白屏,降级BIOS恢复正常。
  14. 计算机桌面右键点击 网络,电脑桌面右键单击鼠标一直转圈如何解决
  15. 龙之谷2服务器维护,龙之谷2今日上线!详细攻略带你玩转阿尔特里亚大陆
  16. 【视频演示】B站视频演示
  17. GSM模块_GPRS网络中使用TCP协议比使用UDP有何优势
  18. 三言两语 (不定时更)
  19. 临界区、互斥量、事件、信号量四种方式
  20. 分布式系统课程总结 西电计算机学院

热门文章

  1. java-for循环嵌套+if语句画星星带留空三角形
  2. 如何旋转苯环化学结构
  3. google地图过期,出现此页面无法正确加载 Google 地图问题修改
  4. python使用代理访问服务器
  5. AutoPlay Media Studio 入阶教程
  6. 计算机苏教版初一教案,苏教版初中七年级信息技术全册教案.docx
  7. AudioOptions
  8. 记录下javaMail发送邮件遇到的问题-(邮件中文昵称)
  9. Android 依赖注入 DI - Dagger2
  10. 深度解读,In-consistent, Crash-consistent, Application-consistent