C语言:函数的作用域和生命周期

【C语言】字符串的输入和输出 控制用户输入长度 fgets()函数 | C语言面试:解释一下C语言中的局部变量和全局变量的生命周期和作用域。 案例 和上篇博文一样,也是由用户输入一个名字,再输出。这里要求控制用户输入的长度。即防止缓冲区溢出。而函数gets()不能限制输出字符串的长度,很容易引起缓冲区溢出。 这里使用能限制输入字符串长度的函数, fgets(name,sizeof(name),stdin); 将更有利于设计安全可靠的程序。 #include <stdio.h> #define N 10 int main(){ char name[N]; printf("Enter your name:"); fgets(na 阅读详情

变量的作用域

引入问题

我们在函数设计的过程中,经常要考虑对于参数的设计,换句话说,我们需要考虑函数需要几个参数,需要什么类型的参数,但我们并没有考虑函数是否需要提供参数,如果说函数可以访问到已定义的数据,则就不需要提供函数形参。那么我们到底要不要提供函数形参,取决于什么?答案就是变量的作用域(如果函数在变量的作用域范围内,则函数可以直接访问数据,无需提供形参)

变量作用域

概念:变量的作用范围,也就是说变量在什么范围有效。

变量的分类

根据变量的作用域不同,变量可以分为:

  • 全局变量

    说明:定义在函数之外,也称之为外部变量或者全程变量。

    作用域:从全局变量定义到本源文件结束。

    初始值:整型和浮点型,默认值是0;字符型,默认值是\0;指针型,默认值NULL

    举例:

      int num1;  // 全局变量,num1能被fun1、fun2、main共同访问
      void fun1(){}
      int num2;  // 全局变量,num2能被fun2、main共同访问
      void fun2(){}
      void main(){}
      int num3;  // 全局变量,不能被任何函数访问  
  • 局部变量

    说明作用域初始值
    形式参数(形参)函数作用域随机值,需要手动赋初值
    函数内定义的变量函数作用域随机值,需要手动赋初值
    复合语句中定义的变量块作用域随机值,需要手动赋初值
    for循环表达式1定义的变量块作用域随机值,需要手动赋初值

    举例:

     
     // a,b就是形式参数(局部变量)
      int add(int a, int b)
      {
        
          return a + b;
      }
      
      int add2(int a, int b)
      {
          // z就是函数内定义的变量(局部变量)
          int z = a + b;
          return z;
      }
      
      int list(int arr[], int len)
      {
          // i就是for循环表达式1的变量(局部变量)
          for(int i = 0; i < len; i++)
          {
              // num就是复合语句中定义的变量(局部变量)
              int num = arr[i];
          }
      }

    使用全局变量的优缺点:

    优点:

    1. 利用全局变量可以实现一个函数对外输出的多个结果数据。

    2. 利用全局变量可以减少函数形参的个数,从而降低内存消耗,以及因为形参传递带来的时间消耗。

    缺点:

    1. 全局变量在程序的整个运行期间,始终占据内存空间,会引起资源消耗。

    2. 过多的全局变量会引起程序的混乱,操作程序结果错误。

    3. 降低程序的通用性,特别是当我们进行函数移植时,不仅仅要移植函数,还要考虑全局变量。

    4. 违反了“高内聚,低耦合”的程序设计原则。

    总结:

    我们发现弊大于利,建议尽量减少对全局变量的使用,函数之间要产生联系,仅通过实参+形参的方式产生联系。

作用域举例

注意:

如果全局变量和局部变量同名,程序执行的时候,就近原则(区分作用域)

 
 int a = 10;  // 全局变量  全局作用域
  // int a = 22;  // 错误的,全局作用域已经存在a变量
 ​
  int main()
  {
      int a = 20;  // 局部变量  函数作用域,作用域不同,可以出现同名变量
      
      printf("%d\n", a); // 20 就近原则
      
      for (int a = 0; a < 5; a++)  // 局部变量 块作用域
      {
          printf("%d", a); // 0 1 2 3 4  就近原则
      }
      
      for (int a = 0; a < 5; a++)  // 局部变量 块作用域
      {
          printf("%d", a); // 0 1 2 3 4  就近原则
      }
      
      printf("%d\n",a);  // 20 就近原则
  }

注意:C语言中,同一个C文件中,是可以出现多个同名变量的,但是多个同名的变量的作用域不能相同。

变量的生命周期

定义

概念:变量在程序运行中的存在时间(内存申请到内存释放的时间)

根据变量存在的时间不同,变量可分为静态存储方式和动态存储方式

​

变量的存储类型

语法:

  变量的完整定义格式: [存储类型] 数据类型 变量列表;   

存储类型:

  • auto

    auto存储类型只能修饰局部变量,被auto修饰的局部变量是存储在动态存储区(栈区和堆区)的。auto也是局部变量默认的存储类型。

      
    int main()
      {
          int a;
          int b;
          // 以下写法等价于上面写法
          auto int a;
          auto int b;
          
          int a,b;
          // 以下写法等价于上面写法
          auto int a,b;
      }

  • static

    修饰局部变量:局部变量会被存储在静态存储区。局部变量的生命周期被延长。但是作用域不发生改变,不推荐

    修饰全局变量:全局变量的生命周期不变,但是作用域衰减,一般限制全局变量只能在本源文件内访问,其他文件不可访问。

    修饰函数:被static修饰的函数,只能被当前文件访问,其他引用该文件的文件是无法访问的,有点类似于java中private

  • extern

    外部存储类型:只能修饰全局变量,此全局变量可以被其他文件访问,相当于扩展了全局变量的作用域。

    extern修饰外部变量,往往是外部变量进行声明,声明该变量是在外部文件中定义的。起到一个标识作用。函数同理。

    demo01.c

    #include "demo01.h"
      
      int fun_a = 10;
      int fun1(){..}

    demo02.c

     #include "demo01.h"
      
      // 声明访问的外部文件的变量
      extern int fun_a;
      // 声明访问的外部文件的函数
      extern int fun1();
          
      int fun2();
  • register

    寄存器存储类型:只能修饰局部变量,用register修饰的局部变量会直接存储到CPU的寄存器中,往往将循环变量设置为寄存器存储类型(提高读的效率)

      for (register int i = 0; i < 10; i++)
      {
          ...
      }

面试题
static关键字的作用
  1. static修饰局部变量,延长其生命周期,但不影响局部变量的作用域。

  2. static修饰全局变量,不影响全局变量的生命周期,会限制全局变量的作用域仅限本文件内使用(私有化);

  3. static修饰函数:此函数就称为内部函数,仅限本文件内调用(私有化)。static int funa(){..}

内部函数和外部函数
  • 内部函数:使用static修饰的函数,称作内部函数,内部函数只能在当前文件中调用。

  • 外部函数:使用extern修饰的函数,称作外部函数,extern是默认的,可以不写(区分编译环境),也就是说本质上我们所写的函数基本上都是外部函数,建议外部函数在被其他文件调用的时候,在其他文件中声明的时候,加上extern关键字,主要是提高代码的可读性。

R语言vegan包实战:用varpart函数搞定生态学VPA分析(附完整代码与数据集) 本文详细介绍了如何使用R语言vegan包中的varpart函数进行生态学方差分解分析(VPA),包括数据准备、模型构建、结果解读和可视化呈现。通过完整的代码示例和数据集,帮助研究者理解不同环境因子对生物群落变化的相对贡献,并掌握显著性检验等高级技巧。 阅读详情

相关推荐

RT-2(robotics-transformer2)论文--阅读笔记

谷歌RT-2机器人论文的阅读笔记。

weixin_61255639的博客 1828

C语言:函数的定义,调用,变量的作用域和生命周期和储存类型

定义语法返回类型 函数名称(数据类型 参数名1,数据类型 参数名2,数据类型 参数名3,数据类型 参数名4,...) 参数列表return 表达式;} //函数体返回值 :类型 int ,long, double ,float ,char, void(表示不返回任何数据)。不能返回数组类型。情况1,表示函数调用是否成功的状态 0(表示调用成功) 1(调用失败)情况2,计算的结果。函数名 :标识符, 字母,数字 ,_ ,不能数字开头。见名知意参数:会与其他模块进行交互。

m0_74339942的博客 1040

MoveIt避坑指南:UR机械臂编程中常见的5个错误及解决方法

本文针对UR机械臂与MoveIt集成开发中的常见问题,总结了五个典型错误及其解决方案,包括关节限位设置、坐标系混淆、规划器选择、运动学求解器配置以及线程资源管理。重点分析了正逆运动学求解错误的原因,并提供了调整容忍度、显式指定坐标系、选择合适规划器及优化IK配置等实用代码示例,帮助开发者提升编程效率与系统稳定性。

root9的博客 434

C语言基础:函数和数组的关系 变量的作用域和生命周期

数组传参:一维字符数组传参只需传递数组名,函数通过\0判断结束;二维数组传参需指定列数,行数需额外传递。 数组传参本质传递首元素地址(8字节)。 变量作用域与生命周期: 局部变量:作用域限于定义块内,动态生命周期,存储在栈区; 全局/static变量:全局作用域或局部作用域(static),静态生命周期,存储在数据区(未初始化默认为0)。 存储类型: static延长局部变量生命周期或限制函数/全局变量作用域; register建议变量存寄存器(不可取址); extern声明全局变量/函数供外部文

yxg0505的博客 539

抖音风控参数‘bd-ticket-guard-client-data’深度解析:从X.509证书到请求签名的完整链路

本文深度解析抖音风控参数‘bd-ticket-guard-client-data’的技术实现,从X.509证书体系到请求签名的完整安全链路。通过Python代码示例,揭示证书生成、签名算法及票据封装等核心机制,帮助开发者理解现代平台风控系统的多层防御架构设计。

weixin_42525738的博客 432

Tessent实战:网表扫描链插入全流程解析

本文详细解析了使用Tessent工具为网表插入扫描链(Scan Chain)的全流程。从前期环境配置、网表检查,到扫描链数量、时钟域等核心配置,再到执行扫描单元替换与连接,最后进行结果验证与文件输出。文章提供了关键命令与实用技巧,帮助工程师高效完成DFT设计,确保芯片可测试性。

hhh00的博客 747

学嵌入式和C语言编程|学习日记Day11:各类数组作函数参数、变量作用域、生命周期、存储类别

在嵌入式开发当中,局部、全局、static 静态变量使用频率非常高,直接关系到外设状态保存、多文件工程开发,是嵌入式 C 的核心重点。嵌入式常用场景:按键计数、状态标记,用 static 局部变量保存上一次状态,函数多次调用之间保留数值。今天继续拓展函数传参,学习一维字符数组、二维整型数组、二维字符数组作为函数参数的规则;返回值 函数名(char 数组名[][列数], int 行数)返回值 函数名(int 数组名[][列数], int 行数)作用域:标识符、变量能够被访问、使用的代码范围。

kkkkkkkkkk_Z的博客 185

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。  通过博文了解💝💝💝    1💝💝💝----adb禁用或者删除系统app导致无法开机的几种解决方法 2💝💝💝----如何保数据来无损恢复机型 3💝💝💝----其他保数据解决系统类故障无法开机的步骤解析

小马哥的专栏 1352

C语言变量作用域

变量作用域 目录变量作用域1.作用域2.链接3.储存期 1.作用域 作用域描述程序中可访问标识符的区域。一个C变量的作用域可以是块作用域,函数作用域,函数原型作用域或文件作用域。 代码块作用域 代码块是指一对花括号之间的代码,函数的形参虽然是在花括号之前定义,也属于代码作用域。 声明在内层块中的变量,其作用域仅局限在该声明所在的块: int fun(int a){ int i; for(i...

weixin_45747214的博客 536

WorkBuddy最新更新特性(2026-07-21)

WorkBuddy最新更新特性

AI人人懂 573

idea出现 EXCEPTION_ACCESS_VIOLATION (0xc0000005) 的解决方法

idea启动的时候出现如下问题,以为没啥事,就索性关闭 后面再打开idea的时候发现直接闪退,之后打开其他软件,直接蓝屏

码农研究僧的博客 4817

C语言中static的用法(修饰局部变量,修饰全局变量,修饰函数)

static 关键字有三种用法 static 修饰局部变量 - 静态局部变量 static 修饰全局变量 - 静态全局变量 static 修饰函数 - 静态函数 static 关键字的三种用法1. static 修饰局部变量 - 静态局部变量2. static 修饰全局变量 - 静态全局变量3. static 修饰函数 - 静态函数 1. static 修饰局部变量 - 静态局部变量 static可使得局部变量出了自己的范围也不会销毁,本质上是改变了局部变量的生命周期,但其作用域还是局部的。 详细点说,

m0_53558236的博客 1万+

基于Dify实现对Excel的数据分析

在dify部署完成后,大家就可以基于此进行各种应用场景建设,目前dify支持聊天助手(包括对话工作流)、工作流、agent等模式的场景建设,我们在日常工作中经常会遇到各种各样的数据清洗、格式转换处理、数据统计成图等数据分析工作,本次主要基于对话工作流模式对Excel文件、csv文件进行解析处理,并进行成图等数据分析工作。主要用到的插件有LLM节点,文档提取器、参数提取器、自定义代码节点、echart插件等。实现解析Excel数据,经过上述不同节点的处理分析流程,最终实现数据统计图展示。

hhue2007的专栏 1万+

C语言存储类别、链接和内存管理:基础概念,作用域和链接种类

C语言存储类别、链接和内存管理 基础概念 首先就是介绍一些基本概念,然后就是分别扩展这些概念的属性: 对象:内存中一个存储单位存储的具体的值 标识符 / 左值:就是代码中代表内存中对象的值,比如: int sign=1; 中的sign就是一个标识符,sign+1就不是一个标识符,因为它不代表内存中的任何一个值。 但是结合到指针就会再复杂一点: char address[]="hello world"; 这里*(address+1)也可以算是一个标识符,因为其也代表一个内存地址。 标识符有一个特性就是

TROUBLE I AM IN 347

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[C语言基础]作用域,链接,存储周期

目录作用域function--函数域file--文件域block--块域function prototype--函数原型域链接内部链接外部链接空链接存储时期static--静态生命周期automatic--自动生命周期 九层之台,起于累土。 作用域 作用域:Scope of Identifiers。 同一标识符指定的不同实体要么具有不同的作用域,要么在不同的命名空间。 标准C定义了4个域: function(函数域) file(文件域) block(块域) function prototype(函

伍局 274

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C语言中的static和extern:一分钟搞懂作用域与生命周期

本文用最通俗的语言,一分钟带你搞懂 C 语言中 static 和 extern 的核心区别。通过代码示例和对比表格,清晰解释 static 如何“锁定”作用域并延长变量生命周期,以及 extern 如何实现跨文件共享。附记忆口诀和常见避坑提醒,适合初学者快速上手,不再被这两个关键字绕晕。

2401_82419694的博客 389

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C语言 变量的作用域和生命周期(转)

转自 https://blog.youkuaiyun.com/u011616739/article/details/62052179 a.普通局部变量 属于某个{},在{}外部不能使用此变量,在{}内部是可以使用。执行到普通局部变量定义语句,才会分配空间,离开{},自动释放。普通局部变量不初始化,默认值为随机数。 b.static局部变量 属于某个{},在{}外...

weixin_30258027的博客 141

c语言 static运用,灵活改变生命周期,让你写代码如鱼得水

static的灵活运用, 以及生命周期的改变, 让你写代码由儒生入儒圣

TheshyO_o的博客 1460

c语言中static关键字有两个作用

c语言中static关键字有两个作用,一是文件作用域,二是函数作用域。  一、文件作用域  文件作用域关键字static的作用是,以static申明的全局变量、函数不得被其他文件所引用,例如:  //这是mystr.c文件的内容  #include   static int num = 10;  int mynum = 100;  static int str

s202090414的专栏 589

c语言中static的作用,它来了!!

static概述修饰局部变量修饰全局变量修饰函数 概述   提到static关键字,相信大家都不陌生,这是相对比较难以理解的一个关键字,相信各位也都能深深感受的到!   本篇文章将总结一下static这个关键字的三个作用。static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。   但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文将为大家介绍一下static的作用,如有写的不对的地方,请及时指出。 修饰局部变量   我们都知道,变量如果我们不直接给它赋

qq_46877337的博客 1843

c语言中关键字static的作用

在我们日常使用过程中,static通常有两个作用: 1、修饰变量 静态全局变量:全局变量前加static修饰,该变量就成为了静态全局变量。我们知道,全部变量在整个工程都可以被访问(一个文件中定义,其它文件使用的时候添加extern关键字声明 ),而在添加了static关键字之后,这个变量就只能在本文件内被访问了。因此,在这里**,static的作用就是限定作用域**。 静态局部变量:局不变量添加了...

belongHWL的博客 387

初识c语言(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决.

m0_63562631的博客 981

c语言static详解

<br />c语言static详解<br /> <br />c语言中static关键字有两个作用,一是文件作用域,二是函数作用域。 <br /> <br />一、文件作用域 <br /> <br />文件作用域关键字static的作用是,以static申明的全局变量、函数不得被其他文件所引用,例如: <br /> <br />//这是mystr.c文件的内容 <br />#include <string.h> <br /> <br />static int num = 10; <br /> <br />in

大道相通 864

c语言存储类别用法,C语言存储类别(Storage Class)

C语言中,存储类别(Storage Class)是一个标识符(也就是说函数和变量)的重要属性。存储类别决定着一个函数或变量的作用域(Scope,即可见性)和生命周期(Life time)。C语言中,主要有四种存储类别,即auto、register、static和extern,下面将一一说明。在说明之前,先讲清楚几个概念:(1) 定义(Definition)和声明(Declaration)声明是通知...

weixin_39802962的博客 1189

(C语言篇)第一章c语言入门基础——上

前言:相信很多刚接触c语言的萌新,

Autonmy_的博客 1343

【C语言】c语言中auto、static、extern关键字作用及其对变量和函数的作用

每一个变量和函数都有两个属性,数据类型和数据的存储类别 存储类别 auto自动的 动态的分配存储空间数据存储在动态存储区中 函数中的形参和在函数中定义的局部变量包括在复合语句中定义的局部变量 调用该函数时,系统会给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间,auto可以省略,大部分变量都是自动类型 不在编译时赋初值,而是在函数调用时进行赋初值每一次函数调用重新给一次初值,相当于执...

这道题我不会做...不会做啊..太难了!! 891
上一篇: C语言:函数后续
下一篇: C语言:指针基础知识
三道渊
博客等级 码龄3年 118粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值