变量的存储期是指程序运行过程中,变量在内存中的生存期,可以理解为变量的寿命。C语言中变量的存储期有自动存储期和静态存储期两种。

一般情况下,变量的存储期和作用域是紧密相关的。在函数外面定义的全局变量都拥有文件作用域,同时被赋予静态存储期,其生存期直至程序运行结束,可理解为拥有“永久”寿命。

在函数内或其他程序块{ }中定义的变量都拥有块作用域,一般情况下被赋予自动存储期,其生存期从被定义开始直至该程序块结束(大花括号)处。

另外,在函数内或其他程序块{ }中使用存储类说明符 static 定义的变量,也被赋予静态存储期,其生存期也直至程序运行结束(如代码清单 1 中所示)。

代码清单 1:自动存储期和静态存储期

#include

#include

int fx=0;

void func(void)

{

static int sx=0;

int ax=0;

printf("%3d %3d %3d\n",ax++,sx++,fx++);

}

int main( )

{

system("color 70");

int i;

printf(" i ax sx fx\n");

printf("----------------\n");

for(i=0;i<10;i++)

{

printf("%3d ",i);

func();

}

printf("----------------\n");

system("pause");

return 0;

}

运行结果为:

i ax sx fx

----------------

0 0 0 0

1 0 1 1

2 0 2 2

3 0 3 3

4 0 4 4

5 0 5 5

6 0 6 6

7 0 7 7

8 0 8 8

9 0 9 9

----------------

在代码清单 1 的程序中,变量 fx 在函数外面被定义,因而具有文件作用域,被赋予静态存储期。在程序执行到int fx=0;的时候,在内存中变量 fx 就被创建出来并进行初始化,直至程序运行结束时变量 fx 才在内存中消失。

变量 sx、ax、i 都是在函数内被定义的,都具有块作用域:

sx 是用存储类说明符 static 定义的,因而被赋予静态存储期。在程序执行开始的时候(main( )函数执行之前),在内存中变量 sx 被创建出来并进行初始化,并且直至程序运行结束时才消失。

ax、i 并没有用存储类说明符 static 定义,因而它们只被赋予自动存储期,在程序调用一次 func( ) 函数执行到 int ax=0; 的时候,在内存中变量 ax 被创建出来并进行初始化,当它所在的 func( ) 函数调用结束时,它就在内存中消失了。

在程序运行到执行 main( ) 函数中的int i;的时候,变量 i 被创建并初始化,直到 main( ) 函数执行结束它才消失。

在整个程序执行过程中,拥有静态存储期(永久寿命)的变量 fx 和 sx 会一直自动增加,直至程序结束时它们的值均为 9。而只在函数 func( ) 中存在的变量 ax,由于每次函数调用中,它都被重新创建并初始化为 0,因而它被创建了 10 次之后,它的值始终还是 0。

图 1 形象地列出了代码清单 1 的程序在运行过程中,内存中各变量对象的生成和消失过程。

图 1:C 程序执行过程中,变量对象的生成和消失

总结

在函数外定义的变量,被赋予静态存储期,拥有“永久”的寿命。

在函数内使用 static 定义的变量,被赋予静态存储期,也拥有“永久”的寿命。

在函数内不使用 static 定义的变量,被赋予自动存储期,其寿命仅限于它所在的程序块。

c语言变量生存期,C语言变量的生命周期相关推荐

  1. C语言基础1:初识C语言(转义、注释;数组、操作符、反码、补码、static、define、指针、结构体常变量;局部变量;作用域、生命周期)

    文章目录 C语言基础1:初识C语言 1.C语言简介 1.1什么是C语言 1.2C语言的发展 2.第一个C语言程序 2.1创建项目 2.2添加源文件 2.3写代码 3.数据类型 4.变量.常量 4.1定 ...

  2. C语言数据类型、变量、常量、作用域和生命周期的概念解释和案例

    目录 一.数据类型 二.变量 变量的命名: 变量的分类: 变量的使用: 三.常量 常量的定义和分类 四.变量作用域和生命周期 作用域: 生命周期: 一.数据类型 当我们去超市购物的时候,看到商品的标价 ...

  3. java中对象的生存期_JSP中JavaBean的生命周期

    JSP中JavaBean是通过标签来声明实现的,基本语法如下: class="className" scope="page/request/session/applica ...

  4. 静态成员变量和非静态成员变量的对比

    静态成员变量和非静态成员变量的对比 1.存储的数据 静态成员变量存储的是所有对象共享的数据 非静态成员变量存储的是每个对象特有的数据 2.存储位置 静态成员变量是随着类的加载在方法区的静态区开辟内存了 ...

  5. 实例变量、静态变量、局部变量的生命周期

    文章目录 前言 一.静态变量和实例变量的生命周期 二.局部变量的生命周期 三.总结 前言 本篇内容出自<Java面向对象编程:孙卫琴>第三章部分内容,目的是带你搞懂实例变量.静态变量.局部 ...

  6. c语言作用域有哪两种变量,2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期...

    7.7 变量的存储类别.作用域及生存期 1.变量的存储类别 在C语言中,有两类存储类别:自动类别及静态类别. 有4个与两种存储类别有关的说明符:auto(自动).register(寄存器).stati ...

  7. C语言-变量生存期及作用域

    目录 1 变量的生存期和作用域 2 默认初始化规则(C++11) 1 变量的生存期和作用域 变量的储存方式:动态储存(自动.寄存器).静态储存(静态和外部) 储存方式 名称 自动变量 anto 寄存器 ...

  8. c语言变量作用域生命周期,C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期...

    谭浩强书: 从存储模型可以看到,谭浩强和钱能的模型有一定的对应关系: 静态存储区  ->  全局数据区 动态存储区  ->  栈(stack) 变量的类型: 1. 局部变量和全局变量 局部 ...

  9. A13在c语言中是合法变量吗,C语言中局部变量和全局变量等在内存中的存放位置.doc-资源下载在线文库www.lddoc.cn...

    C语言中局部变量和全局变量_等在内存中的存放位置.doc C 语言中局部变量和全局变量 变量的存储类别static,extern,auto,register 8.8 局部变量和全局变量在讨论函数的形参 ...

最新文章

  1. UICollectionView的headerView、footerView使用以及与UITableView加载headerView、footerView的区别...
  2. Cocos2d 之FlyBird开发---GameData类
  3. 创业故事:腾讯的创始人们
  4. JNI字段描述符[Ljava/lang/String
  5. **PCL:嵌入VTK/QT显示(Code^_^)
  6. 在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据
  7. SAP CRM Fiori My note应用的note header设计
  8. C++总结笔记(二)——指针
  9. 英特尔中国:截至2018年底女性员工占比33%
  10. 【转载】程序员这口饭-职业规划解决方案
  11. 经典CNN网络:VGG16-输入和输出
  12. 数字图像直方图匹配或规定化Histogram Matching (Specification)处理
  13. FEEMD-快速EEMD
  14. TiCDC系列分享-01-简述产生背景及使用概况
  15. 使用VMware安装CentOS
  16. EasyPoi 导出表格并设置表头
  17. 闽江学院计算机与控制工程学院在哪个校区,计算机与控制工程学院举行优秀校友分享会...
  18. MySql命令行基本语法
  19. MAC盗版软件下载网站黑名单
  20. C++在类对象上使用新式for循环

热门文章

  1. IE与FF脚本兼容性问题
  2. oracle静默安装快吗,Oracle静默安装简要的注意事项
  3. quickpcb添加pcb库_南京阿勒勾电子 quickpcb2005详细步骤教程
  4. java 双线程交替,Java 创建两个线程,和主线程交替运行。
  5. html载入图片代码,TextVeiw加载HTML代码块内图片
  6. mysql join 索引 无效_ORACLE MYSQL中join 字段类型不同索引失效的情况-阿里云开发者社区...
  7. Oracle数据库exp和imp方式导数据
  8. android判断是否已经安装成功,android 判断应用程序是否已安装
  9. 大数据学习笔记07:分布式文件系统HDFS
  10. Gson案例:Java对象与JSON字符串相互转换