我的编程空间,编程开发者的网络收藏夹
学习永远不晚

c语言中关键字Static怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

c语言中关键字Static怎么用

这篇文章将为大家详细讲解有关c语言中关键字Static怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、可执行程序内存分配

1. 可执行程序程序分段

一个程序的3个基本段:text段,data段,bss段

c语言中关键字Static怎么用

BSS BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。

特点是:可读写的,在程序执行之前BSS段会自动清0。

所以,未初始的全局变量在程序执行之前已经成0了。

注意和数据段的区别,BSS存放的是未初始化的全局变量和静态变量,数据段存放的是初始化后的全局变量和静态变量。

UNIX下可使用size命令查看可执行文件的段大小信息。如size a.out。

数据段.data 存放在编译阶段(而非运行时)就能确定的数据,可读可写。

也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存在这个区域。数据段,代码段在程序运行之前就已经确定了的。

代码段.text 代码段通常是指用来存放程序执行代码的一块内存区域。

这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许自修改程序。

在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

text段在编译时确定,内存中被映射为只读,但date段与bss段是可写的。

2. c语言五大内存分区

1.栈区(堆栈区stack)

堆栈是由编译器自动分配释放,存放函数的参数和局部变量的值(auto类型),操作方式类似于数据结构中的栈。栈的申请是由系统自动分配,如在函数内部申请一个局部变量int  h,同时判断所申请空间是否小于栈的剩余空间,如果小于则为其开辟空间,为程序提供内存,否则将报异常提示栈溢出。

2.堆(heap)

堆一般由程序员分配释放,若程序员不释放,程序结束可能由OS回收。

它与数据结构中的堆是两回事,分配方式类似于链表,申请则是程序员自己操作使用malloc或new。

申请过程比较复杂,当系统收到程序的申请时,会遍历记录空闲内存地址的链表,以求寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序,有些情况下,新申请的内存块的首地址记录本次分配的内存块的大小,这样在free()时能正确的释放内存空间。

3.全局静态存储区

全局变量与静态变量的存储是放在一块的,初始化的全局变量与静态变量存放在一块区域,未初始化的全局变量与未初始化的静态变量存放在相邻的另一块区域。

4.文字常量区

常量字符串就是放在该部分,只读存储区,程序结束后由系统释放

5.程序代码区

存放程序的二进制代码区。

c语言中关键字Static怎么用

两者之间区别是:代码段,数据段,堆栈段是cpu级别的概念,五大分区属于语言级别的概念,两者是不同的概念。

3. 可执行程序内存空间与逻辑地址空间的映射与划分

c语言中关键字Static怎么用

左边是UNIX系统的执行文件,右边是进程对应的逻辑地址空间的划分情况

4. 举例

c语言中关键字Static怎么用

二、static 变量

static变量主要区分静态全局变量和全局变量、局部变量和静态局部变量之间的区别。

1. 静态全局变量、全局变量

静态全局变量、全局变量的区别主要通过生存周期和作用域来区别。

c语言中关键字Static怎么用

  • a.静态全局变量和全局变量均存放在数据段.data中;

  • b. 静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后,  尽管该变量还继续存在,但不能使用它。

  • c. 对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。

  • d.全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局  变量的作用域是整个源程序(多个源文件可以共同使用);而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,  在同一源程序的其它源文件中不能使用它。

全局变量实例

以下是b.c 和 a.c源代码

 c语言中关键字Static怎么用

全局变量

编译

gcc a.c b.c

执行结果:

 c语言中关键字Static怎么用

执行结果

由编译结果可知,文件a.c可以访问到b.c文件中的静态全局变量b。

静态全局变量实例

c语言中关键字Static怎么用

编译结果

 c语言中关键字Static怎么用

编译结果

由编译结果可知,文件a.c无法访问到b.c文件中的静态全局变量b,所以编译报错。

2. 静态局部变量、局部变量

静态局部变量、局部变量的区别主要通过生存周期和作用域来区别。

c语言中关键字Static怎么用

静态局部变量存放在数据段.data中,局部变量在栈中;静态局部变量和局部变量都只能在函数体内部才可以访问。

函数每次访问的静态局部变量,该变量的值为最后一次访问修改后的值。

举例:

 1 #include <stdio.h>  2   3   4 void func()  5 {  6     int aa = 11;  7   8     printf("aa= %d \n",aa++);  9  10 } 11  12 int main(int argc, char **argv) 13 { 14  15     func();                                                                                     16     func(); 17  18     return 0; 19 }

 c语言中关键字Static怎么用

对于普通的局部变量,每次调用的时候,都会在栈里初始化1次,

1 #include <stdio.h>  2   3   4 void func()  5 {  6     static int aa = 11;  7                                                                                                  8     printf("aa= %d \n",aa++);  9  10 } 11  12 int main(int argc, char **argv) 13 { 14      15     func(); 16     func(); 17  18     return 0; 19 }

 c语言中关键字Static怎么用

函数中静态变量aa 只初始化一次,每次访问的值应该是上一次调用到该函数时最后处理的结果,

三、static 函数

1. 概念:

在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。

static函数(也叫内部函数)只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。

区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。

先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。

其实我们平时所说的堆栈是栈而不包含堆,不要弄混。

2. 定义静态函数的好处:

  • <1>其他文件中可以定义相同名字的函数,不会发生冲突,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

  • <2>  静态函数不能被其他文件所用。存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。

  • <3> 统计次数功能  声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。

  • <4> 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。

举例

a.c

 1 #include <stdio.h>  2   3 void func();  4   5 int main(int argc, char **argv)  6 {  7       8     func();                                                                                                          9  10     return 0; 11 }

b.c

1 #include <stdio.h> 2  3 int b = 10; 4  5  6 static void func()                                                                                                  7 { 8     printf("in func b =%d\n",b); 9 }

 c语言中关键字Static怎么用

关于“c语言中关键字Static怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

c语言中关键字Static怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言中的Static关键字怎么用

这篇文章主要介绍C语言中的Static关键字怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、static关键字的基本含义首先,static关键字的意思是静态的,用于修饰局部变量,全局变量和函数,修改其数据储存
2023-06-26

C语言中static关键字的作用是什么

本篇内容介绍了“C语言中static关键字的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!static这个关键字是“静态”的意思,
2023-07-05

c语言关键字static的作用是什么

在C语言中,关键字static有以下几种作用:1. 静态变量:static关键字可以用于声明静态变量,静态变量存储在静态存储区,在程序运行期间一直存在,其作用域为局部作用域,但其生命周期为整个程序运行期间。静态变量的初始值默认为0,只会被初
2023-09-14

C/C++的关键字static怎么使用

这篇文章主要介绍“C/C++的关键字static怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C/C++的关键字static怎么使用”文章能帮助大家解决问题。C语言隐藏场景演示当我们同时编译
2023-06-29

C语言的static关键字应用实例分析

这篇文章主要介绍“C语言的static关键字应用实例分析”,在日常操作中,相信很多人在C语言的static关键字应用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言的static关键字应用实例分析
2023-06-30

c++中static关键字的作用

在 c++ 中,static 关键字用于声明变量或函数,使其仅在声明的范围内可见,在程序启动时分配内存,并且保持不变。此外,它还允许跨函数和文件共享数据、存储常量、创建静态局部变量并定义类级函数。C++ 中 static 关键字的作用在
c++中static关键字的作用
2024-05-15

C语言中的关键字怎么用

本篇内容介绍了“C语言中的关键字怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.关键字变更历史1999年12月16日,ISO推出了C
2023-06-17

C语言中volatile关键字怎么用

这篇文章主要介绍了C语言中volatile关键字怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机
2023-06-20

c语言register关键字怎么用

在C语言中,register关键字用于将变量存储在寄存器中,以提高访问速度。但是需要注意的是,register关键字只是给编译器一个提示,不一定会真正将变量存储在寄存器中。register关键字的用法很简单,只需要在变量声明时使用即可。例
c语言register关键字怎么用
2024-02-29

怎么使用c语言中typedef关键字

本篇内容主要讲解“怎么使用c语言中typedef关键字”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用c语言中typedef关键字”吧!1、typedef关键字可以为类型取一个新名字。2、
2023-06-25

C语言中的Const关键字怎么用

这篇“C语言中的Const关键字怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中的Const关键字怎么用”文章吧
2023-06-29

C++ 中如何使用static关键字

C++ 中如何使用static关键字,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、静态全局变量在全局变量前,加上C++ static关键字,该变量就被定义成
2023-06-17

Java中的static关键字怎么用

本文小编为大家详细介绍“Java中的static关键字怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中的static关键字怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一.static关键字
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录