• 变量的生存期


    我们在前面的课程中曾经提到,系统在执行某个函数时,会给这个函数分 配一块新的内存。在这块新内存中存放这个函数的局部变量和形参变量。

        下面我们先来了解一下一个C程序在执行时内丰的分配状态。如果学过汇 编的话就应该知道,系统一开机后,内存被分为两大块。一块是系统区,存放 操作系统等内容,另一块是用户区,用来存放被执行的用户程序。我们主要研 究一下在用户区的内存分配情况。

        一个C程序在运行时,用户区被分为三大块:第一块是程序区,用来存放 C程序运行代码。第二块是静态存储区,用来存放变量,在这个区域中存储的 变量被称作静态变量,如全局变量。第三块是动态存储区,也用来存放变量 以及进行函数调用时的现场信息和函数返回地址等,在这个区域存储的变量 我们称之为动态变量,如形参变量、函数体内部定义的局部变量。

        在C语言中,每一个变量都有两个属性:数据类型和数据的存储类别。数 据类型是我们前面讲过的整型、实型等。而存储类别主要指一个变量在内存 中的存储区域,分为两大类:静态存储和动态存储。

        可是在C的源程序中,我们怎么来规定变量的存储类别呢?

    一、静态存储变量

        凡是用关键字static定义的变量全部被称为静态变量。所有的静态变量全 部存储在静态存储区,在程序的运行期间一直存在。

        按静态变量定义位置的不同,又分为全局静态变量和局部静态变量。它们 有一些小小的区别。

        全局静态变量实际上就是全局变量,一个程序中的全局变量全部存储在静 态存储区中。

        局部静态变量指的是在某个函数中用关键字static定义的变量,这种变量的作用范围只在定义它的函数起作用,但是它存储在静态存储区。我们知道, 一个函数在返回时要将其所占有的内存交还系统。但如果这个函数中定义有静 态变量,函数在返回时这个静态变量不会被释放,仍然保存它的值。如果再次 调用这个函数时,我们就可以直接使用这个保存下来的值.

        看下面的例子:

    int f()

    {static y=0;

    y++;

    return(y);

    }

    main()

    {int i;

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

    printf("%3d",f()); }

    运行结果:

    1 2 3 4 5_

        我们在f函数的内部定义了一个静态变量,对这个函数调用了五次。虽然 在函数内部有一条初始化语句,但由于y是静态变量,所以只在对f函数进行第 一次调用时才对y进行初始化,其它次的调用就直接使用y变量而不再进行初始 化了。

    说明:

        1、局部的静态变量如果不对其进行初始化,那么系统自动对其赋值0。

        2、虽然局部的静态变量在函数返回后依然存在,但由于它是局部变量,所以 其它函数仍然不能对它进行引用。

        3、C语言规定,只有存储在静态存储区中的变量才能对其进行初始化,实际上就是我们前面提到过的:只有对全局变量和用static定义的变量才能进行初 始化。

        4、对静态变量的初始化是在编译阶段完成的,即在程序运行前就已经初始化 完毕了。

    二、动态存储变量

        动态存储变量是存储在动态存储区的,这种变量只在定义它们的时候才创 建,在定义它们的函数返回时系统回收变量所占内存。对这些变量的创建和回 收是由系统自动完成的,所以也叫自动变量(用关键字auto定义)。最典型的 例子就是函数中定义的局部变量。

        一般情况下,关键字auto可以省略,上面这行可以写成 int b,c=4; 它们是 等价的。这样看来,形参变量a也是自动变量。在我们在前面的学习中,见到 的大部分是自动变量。

        一般情况下所有的变量是存放在内存中的,我们知道,计算机是一个多级 缓存系统。程序在运行时,只有需要计算的变量才从内存中取到运算器。如果 有一个变量在某一段时间内重复使用的次数很多,如循环变量。那么,这种从 内存取数的过程将花费大量的时间。所以对这种重复使用的变量,C语言允许 它存放在寄存器中,以提高程序的运行效率。这种变量被称作“寄存器变量” ,用关键字register定义。

        因为计算机系统中寄存器的数目是非常有限的,所以决定了在C程序中寄 存器变量的数目有一定的限制,而且只有动态变量才能作为“寄存器变量”。另外在一些C语言系统中(如Turbo C和MS C),“寄存器变量”实际上是被 当作自动变量来处理的,仍然将这种变量存放在内存中。所以对这种变量,我 们只要了解一下就行。

    三、全局变量的类别

        到这里我们已经学习了三种存储类别 static、auto、register。前面提到,全局变量是静态变量。但是,一个C程序可能是由多个源文件组成的。根据全 局变量是否能被其它源程序使用,又将全局变量分为外部的和内部的。

           1、如果想允许其它源文件访问本文件中的全局变量,在其它源文件中通 过使用关键字extern来定义全局变量。

        对全局变量的这种规定,使得多人分工合作来完成一个任务变得容易。 不用担心自己的变量名与别人的重名。

        经过这一节的学习,我们知道了变量有四种具体的存储类别: (static,auto.register,extern)。

    原文来自:http://www.nttvu.edu.cn/sec/kcjx/c/zs/..%5Czs%5Czs79.htm

  • 相关阅读:
    Android Activity 四种启动模式
    Android Activity的生命周期
    Android SQLite (五 ) 全面详解(三)
    Android SQLite (四 ) 全面详解(二)
    工作流设计 zt
    法律网站分类 ­zt
    刑事案件的构成要素 zt
    犯罪构成三层次记忆口诀 zt
    E asy Boo t 6.51 启动易 制作启动光盘的软件(附注册码)
    父线程开启子进程且共享内存
  • 原文地址:https://www.cnblogs.com/Jim-william/p/4798506.html
Copyright © 2020-2023  润新知