google在最后三页C语言static内容,可找到的资料非常少。无论是长篇大论不知所云的话,在关键位置或跳过,习的人来说參考性不是非常大。所以。我这篇博文博採众家之长,把互联网上的资料整合归类,并亲手编敲代码验证之。

C语言代码是以文件为单位来组织的,在一个源程序的全部源文件里,一个外部变量(注意不是局部变量)或者函数仅仅能在一个源程序中定义一次,假设有反复定义的话编译器就会报错。伴随着不同源文件变量和函数之间的相互引用以及相互独立的关系,产生了extern和statickeyword。

以下,具体分析一下statickeyword在编敲代码时有的三大类使用方法:

一。static全局变量

我们知道,一个进程在内存中的布局如图1所看到的:

当中.text段保存进程所运行的程序二进制文件,.data段保存进程全部的已初始化的全局变量,.bss段保存进程未初始化的全局变量(其它段中还有非常多乱七八糟的段,暂且不表)。在进程的整个生命周期中,.data段和.bss段内的数据时跟整个进程同生共死的,也就是在进程结束之后这些数据才会寿终就寝。

当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量

静态全局变量和其它的全局变量的存储地点并没有差别,都是在.data段(已初始化)或者.bss段(未初始化)内。可是它仅仅在定义它的源文件内有效,其它源文件无法訪问它。所以,普通全局变量穿上static外衣后,它就变成了新娘,已心有所属,仅仅能被定义它的源文件(新郎)中的变量或函数訪问。

下面是一些演示样例程序

file1.h例如以下:

#include <stdio.h>void printStr();

我们在file1.c中定义一个静态全局变量hello, 供file1.c中的函数printStr訪问.

#include "file1.h"static char* hello = "hello cobing!";void printStr()
{printf("%s\n", hello);
}

file2.c是我们的主程序所在文件。file2.c中假设引用hello会编译出错

#include "file1.h"int main()
{printStr();printf("%s\n", hello);return 0;
}

报错例如以下:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
file2.c: In function ‘main’:
file2.c:6: 错误:‘hello’ 未声明 (在此函数内第一次使用)
file2.c:6: 错误:(即使在一个函数内多次出现,每一个未声明的标识符在其
file2.c:6: 错误:所在的函数内仅仅报告一次。)

假设我们将file2.c改为以下的形式:

#include "file1.h"int main()
{printStr();return 0;
}

则会顺利编译连接。

执行程序后的结果例如以下:
[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
[liujx@server235 static]$ ./file2
hello cobing!

上面的样例中,file1.c中的hello就是一个静态全局变量。它能够被同一文件里的printStr调用。可是不能被不同源文件里的file2.c调用。

二。static局部变量

普通的局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定同样。

局部变量也能够在堆上动态分配。可是记得使用完这个堆空间后要释放之。

static局部变量中文名叫静态局部变量。它与普通的局部变量比起来有例如以下几个差别:

1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内。原因见3)),所以它尽管是局部的,可是在程序的整个生命周期中存在。

2)訪问权限:静态局部变量仅仅能被其作用域内的变量或函数訪问。

也就是说尽管它会在程序的整个生命周期中存在,因为它是static的,它不能被其它的函数和源文件訪问。

3)值:静态局部变量假设没有被用户初始化,则会被编译器自己主动赋值为0。以后每次调用静态局部变量的时候都用上次调用后的值。

这个比較好理解,每次函数调用静态局部变量的时候都改动它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次改动后的值。
下面是一些演示样例程序:

file1.h的内容和上例中的同样。file1.c的内容例如以下:

#include "file1.h"void printStr()
{int normal = 0;static int stat = 0;  //this is a static local varprintf("normal = %d ---- stat = %d\n",normal, stat);normal++;stat++;
}

为了便于比較,我定义了两个变量:普通局部变量normal和静态局部变量stat。它们都被赋予初值0;

file2.c中调用file1.h:

#include "file1.h"int main()
{printStr();printStr();printStr();printStr();printf("call stat in main: %d\n",stat);return 0;
}

这个调用会报错,由于file2.c中引用了file1.c中的静态局部变量stat,例如以下:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
file2.c: In function ‘main’:
file2.c:9: 错误:‘stat’ 未声明 (在此函数内第一次使用)
file2.c:9: 错误:(即使在一个函数内多次出现,每一个未声明的标识符在其
file2.c:9: 错误:所在的函数内仅仅报告一次。)

编译器说stat未声明,这是由于它看不到file1.c中的stat,以下注掉这一行:

#include "file1.h"int main()
{printStr();printStr();printStr();printStr();
//  printf("call stat in main: %d\n",stat);return 0;
}

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
[liujx@server235 static]$ ./file2
normal = 0 ---- stat = 0
normal = 0 ---- stat = 1
normal = 0 ---- stat = 2
normal = 0 ---- stat = 3
执行如上所看到的。能够看出,函数每次被调用。普通局部变量都是又一次分配。而静态局部变量保持上次调用的值不变。

须要注意的是因为static局部变量的这样的特性,使得含静态局部变量的函数变得不可重入。即每次调用可能会产生不同的结果。这在多线程编程时可能会成为一种隐患。须要多加注意。

三,static函数
              相信大家还记得C++面向对象编程中的private函数,私有函数仅仅有该类的成员变量或成员函数能够訪问。

在C语言中,也有“private函数”,它就是接下来要说的static函数,完毕面向对象编程中private函数的功能。

当你的程序中有非常多个源文件的时候,你肯定会让某个源文件仅仅提供一些外界须要的接口,其它的函数可能是为了实现这些接口而编写,这些其它的函数你可能并不希望被外界(非本源文件)所看到,这时候就能够用static修饰这些“其它的函数”。

所以static函数的作用域是本源文件。把它想象为面向对象中的private函数就能够了。

以下是一些演示样例:

file1.h例如以下:

#include <stdio.h>static int called();
void printStr();

file1.c例如以下:

#include "file1.h"static int called()
{return 6;
}
void printStr()
{int returnVal;returnVal = called();printf("returnVal=%d\n",returnVal);
}

file2.c中调用file1.h中声明的两个函数。此处我们有益调用called():

#include "file1.h"int main()
{int val;val = called();printStr();return 0;
}

编译时会报错:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
file1.h:3: 警告:‘called’ 使用过但从没有定义
/tmp/ccyLuBZU.o: In function `main':
file2.c:(.text+0x12): undefined reference to `called'
collect2: ld 返回 1
由于引用了file1.h中的static函数,所以file2.c中提示找不到这个函数:undefined reference to 'called'

以下改动file2.c:

#include "file1.h"int main()
{printStr();return 0;
}

编译执行:

[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2
[liujx@server235 static]$ ./file2
returnVal=6

static功能,可以解决同名不同功能的问题,在原始文档是非常好,因为在其他的源文件源文件的static功能是不可见的。

希望你有很多监督当地翼的~~

C语言static 具体分析相关推荐

  1. C语言静态变量static的分析

    对C语言静态变量static分析,解释了static为什么在局部变量里面定义的时候不会随着函数执行完毕而销毁,也稍微用解释了静态存储区和动态存储区的小知识 文章目录 学习static前要先认识 sta ...

  2. C语言STATIC用法

    C语言STATIC用法 转自:http://blog.csdn.net/vagrantisme/article/details/4083722       1. static 变量 静态变量的类型 说 ...

  3. c语言实现协议层层消息,纯C语言实现面向对象分析与示例分享.pdf

    纯C语言实现面向对象分析与示例分享 采用 语言实现的关键是如何运用 语言本身的特性来实现多态.继承面.封装的面向对 C C 象的特征最近给出了例子,大家可以参考使用 , C语言的对象化模型 面向对象的 ...

  4. c 程序设计语言 好难,C程序设计语言难点及分析

    <C程序设计语言难点及分析>由会员分享,可在线阅读,更多相关<C程序设计语言难点及分析(20页珍藏版)>请在人人文库网上搜索. 1.C语言难点分析整理!语言难点分析整理!转贴转 ...

  5. c语言static(c语言static是什么意思)

    怎样把C语言学好怎样把C语言学好?怎样把C语言学好怎样把C语言学 重要的是急不了的,要一步一步来,慢慢来,把每个知识都学好,烂熟于心,到时就能灵活运用,加油吧孩子.不难的,打好基础 什么是C语言 C语 ...

  6. R语言亚组分析 (Subgroup Analysis)及森林图绘制实战

    R语言亚组分析 (Subgroup Analysis)及森林图绘制实战 目录 R语言亚组分析 (Subgroup Analysis)及森林图绘制实战 #亚组分析

  7. R语言伪相关性分析(Spurious Correlation)、相关关系不是因果关系:以哺乳动物数据集msleep为例

    R语言伪相关性分析(Spurious Correlation):相关关系不是因果关系.相关关系不是因果关系.相关关系不是因果关系 #correlation doesn't means causatio ...

  8. R语言伪相关性分析(Spurious Correlation)、相关关系不是因果关系:以缅因州离婚率数据集为例

    R语言伪相关性分析(Spurious Correlation).相关关系不是因果关系:以缅因州离婚率数据集为例 #correlation doesn't means causation 目录

  9. R语言构建生存分析(survival analysis)模型示例

    R语言构建生存分析(survival analysis)模型示例 生存分析处理的是预测特定事件将要发生的时间.它也被称为失败时间分析或死亡时间分析.例如,预测癌症患者存活的天数,或者预测机械系统将要失 ...

最新文章

  1. 这哥们,第一份工作就年薪30w。。
  2. 具有SSM框架的CRUD与多条件查询
  3. python能够处理的最大整数是多少_python中能输出的最大整数位是多少
  4. 课工场java新手基础教程_Java新手学习路线,学Java不走弯路
  5. 广东移动携手远传技术 共建移动客服标杆
  6. 【跃迁之路】【451天】程序员高效学习方法论探索系列(实验阶段208-2018.05.02)...
  7. 转载——开阔自己的视野,勇敢的接触新知识
  8. Apollo技能图谱2.0焕新发布 更新7大能力91个知识点
  9. 视觉错觉模型_极具视觉爆发力的影院设计
  10. php下的ssm模式,编码风格:Mvc模式下SSM环境,代码分层管理
  11. spark开发demo
  12. 1.如何判断正交表对错
  13. 网页前端第五次培训(JS的一些基本使用)
  14. 手机锁屏密码忘了怎么办
  15. 【UNR #1】火车管理
  16. CSDN 简单的MD编辑器-基础知识
  17. Mathematica字符串处理之-mywife.cc
  18. 2020年了,OCM认证,还有含金量么?
  19. 校园英语杂志《校园英语》杂志社《校园英语》编辑部2023年第一期目录
  20. ubuntu16.04 系统安装后关机不关电源的问题, 显示System halted

热门文章

  1. 计算机科学与技术历史步伐,计算机科学与技术1001班先进班级体申报材料.pdf
  2. python带我起飞 豆瓣评分_你听过后觉得爽到飞起的电音是哪一首?
  3. linux 定时重启mysql_Linux下定时自动重启apache及mysql
  4. ddz指标最佳数值_一个良心操盘手的肺腑之言:炒股10年从未被套,只依靠RSI指标!...
  5. 浅析Mysql Join语法以及性能优化
  6. 使用class-dump导出其他应用头文件
  7. java silk转mp3_微信小程序录音文件格式silk遇到的问题及解决方法
  8. flat在java中的含义_java – 在flatingBy中使用flatMap的优雅方法
  9. ldap 统一认证 java_如何在你的系统里集成LDAP统一认证
  10. db2关闭下一句sql的日志_MySQL性能管理及架构设计:SQL查询优化、分库分表