精华内容
下载资源
问答
  • 解析:主要考察局部变量和全局变量的生存期,以及静态本地变量。注释后的代码如下: int x, y, z, w; //这里是全局变量,定义在任何函数的外面,若不初始化赋值,则均为0;。注意,主函数里面的变量仍为局部变量...

    int x, y, z, w;
    void p(int *y, int x)
    {
        static int w;
        *y++; x++; w = x+*--y;
        printf("%d#%d#%d#%d#",x,*y,z,w);
    }
    int main(void)
    {
        int x, y, z, w;
        x=y=z=w=1;
        do{
            static int x;
            p(&x, y);
            printf("%d#%d#%d#%d#",x,y,z,w);
        } while(0);
        return 0;
    }

     

    答案:2#0#0#2#0#1#1#1#

     

    解析:主要考察局部变量和全局变量的生存期,以及静态本地变量。注释后的代码如下:

    int x, y, z, w;    //这里是全局变量,定义在任何函数的外面,若不初始化赋值,则均为0;。注意,主函数里面的变量仍为局部变量
    void p(int *y, int x)    //p函数接收整型指针变量和整型变量的输入,返回值为空
    {
        static int w;    //定义静态变量w,若不初始化赋值,则w==0;
        *y++; x++; w = x+*--y;
        printf("%d#%d#%d#%d#",x,*y,z,w);
    }
    int main(void)
    {
        int x, y, z, w;
        x=y=z=w=1;
        do{
            static int x;
            p(&x, y);
            printf("%d#%d#%d#%d#",x,y,z,w);
        } while(0);
        return 0;
    }

    从主函数进行分析,主函数内部定义了四个int型变量,若不进行初始化,则全为0。主函数内部定义完之后就进行了初始化,均初始化为1,所以在do-while内部,可以看到由于只定义了静态局部变量x,而且没有初始化赋值,则静态局部变量x为0,y,z,w均仍为1。所以

     printf("%d#%d#%d#%d#",x,y,z,w);

    的输出是0#1#1#1#。

    再来分析p这个函数:

    void p(int *y, int x)    //p函数接收整型指针变量和整型变量的输入,返回值为空
    {
        static int w;    //定义静态变量w,若不初始化赋值,则w==0;
        *y++; x++; w = x+*--y;
        printf("%d#%d#%d#%d#",x,*y,z,w);
    }

    首先p函数无返回值,接受两个输入:int型指针变量、int型变量。p函数内部同样定义了一个静态局部变量w,但是w后面有赋值的语句

    w = x+*--y;

    *y++和x++是两个关键,首先*和++,--运算符处于同一优先级,结合方向是自右向左。因此*y++可以看做是*(y++),但是由于y++是先执行y,跳出去与*结合,再让y++。所以*y++实际上等效于先执行*y操作,再执行y++。由于y是指针,因此y++是指针所指内存地址的向后移动,移动的大小是一个sizeof(int)。x++同理先执行x(由于没有任何操作,x不变),再让x+1,这里实际上由于x没有任何操作,x++相当于只执行了x+1,由于局部变量传入p函数的x为1,这里x就等于2了。

    由于y是指针变量,因此*y表示取出指针所指内存地址的值。由于传进去的
     static int x;
            p(&x, y);

     

    x是静态变量,则x=0,因此*y=0。这里要注意p的原型是void p(int *y, int x)  ,而使用p函数时,传进去的是

      p(&x, y);
    顺序不要搞反了。w=x+*--y,这里等价于w=x+*(--y),由于在上面的*y++,y已经执行了y+1,这里(--y)先执行--,再执行y,即先执行y-1,再把y-1的结果传出去。注意这里的-1指的是减去一个int型变量的内存大小。因此y还是原来的内存位置。所以*y还是取出原来指针指向内存地址的值,即还是原来的静态局部变量x,值为0。因此w=x+*--y中x=2,(*--y)等于0,所以w=2。由于p函数里的z只能那个接受全局变量,因此z=0,所以p函数执行之后打印:2#0#0#2
     

    展开全文
  • C语言 局部变量与全局变量的生存期

    千次阅读 2019-08-01 19:56:29
    1.局部变量 仅仅在定义它的函数的内才能有效使用,其作用域仅限在函数体内,即从变量定义的位置开始,到函数体结束。 2.局部变量的内存分配: 通常,编译器不为局部变量分配内存单元,而是在程序运行中,当局部...

    定义与声明的区别:把建立存储空间的变量声明称定义,而把不需要建立存储空间的声明称为声明

    静态局部变量,只有定义,没有声明。如果定义时没有赋值,默认其值为0
    

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190801195327885.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIwMjYzNQ==,size_16,color_FFFFFF,t_701在这里插入图片描述

    1.局部变量
    仅仅在定义它的函数的内才能有效使用,其作用域仅限在函数体内,即从变量定义的位置开始,到函数体结束。

    2.局部变量的内存分配:
    通常,编译器不为局部变量分配内存单元,而是在程序运行中,当局部变量所在的函数被调用时,系统根据需要临时为其分配内存。当函数执行结束时,局部变量被撤销,占用内存被收回。

    注意:
    局部变量在函数被调用时由系统分配存储区,在不同的声明周期的函数中同名的变量实际上在内存中占不同的单元,因此在不同的函数中可以定义相同名字的局部变量。生命周期相同的函数的同名局部变量,占用不同的内存单元。

    总结:这种内存分配方式叫自动分配内存,对于自动分配(栈分配),变量与其所在的代码块共存亡。

    补充:
    对于静态分配编译器预分配),变量与程序共存亡,程序开始执行时即已存在,一致到程序运行完毕退出后才撤销。

    静态分配,生命周期就是整个程序执行周期,内存会一直存在,main函数执行之前就创建,无论函数如何运行,如何调用,内存一直不会被回收,一直到程序结束才被系统回收。


    动态分配的生存期,从malloc开始,free结束。

    动态分配和静态分配的区别

    静态分配一般在栈上,系统自己分配和回收内存。动态分配在堆上,由程序员自己决定分配和回收内存。


    跨文件使用:结合extern关键字,调用其他文件中的变量。
    static声明的变量只能在本文件中使用。


    3.全局变量
    在函数外定义的变量称为全局变量,也称外部变量,全局变量的作用域较广,全局变量不属于任何一个函数,理论上可被其作用域中的所有函数访问,因此,提供了一个不同函数间联系的途径,使函数间的数据联系不只局限于参数传递和return语句。

    全局变量的作用域就是从其定义处到源文件结束,调用全局变量不能超出其作用域。

    全局变量一经定义,编译器会为其分配固定的内存单元,在程序运行期间,这块内存单元始终有效,一直到程序执行完毕才由操作系统收回该块内存

    全局变量:extern变量又称全局变量,放在静态存储区,所谓全局,是说该变量可以在程序的任意位置使用,其作用域是整个程序代码范围内,可以被程序其他函数所引用,不仅仅局限在本文件。


    5. 全局变量的声明与定义在函数外部:
    Int num 就会被解析为extern int num;
    Int num = 10就会被解析为 extern int num =10;

    6. 全局变量定义的基本格式为:
    extern 类型 变量名 = 初始化表达式 ;
    此指令通知编译器在静态存储区中开辟一块指定类型大小的内存区域,用于存储该变量
    例如:创建了一个初始值为100的int型全局变量m:
    extern int m=100;

    7.C语言规定,只要是在外部,即不是在任何一个函数内定义的变量,编译器就将其当作全局变量,无论变量定义前是否有extern说明符

    8.全局变量仅有声明,没有赋值,调用时会报错

    extern作用域是本程序的所有源代码文件,只要在一个文件中定义,在其他文件中使用时只要对其进行声明即可。
    静态全局变量其作用域仅限于从定义位置起到本文件结束的一段代码区域,不能被其他文件中的函数所使用。


    展开全文
  • 使用static声明的局部变量生存期

    千次阅读 2016-03-24 16:19:19
    static声明的局部变量,在程序执行前就产生,存放在内存的静态存储区,只能被赋值一次,生命周期为整个程序,而不是从声明处开始。 它与全局变量的区别在于可见性:全局变量为文件作用域,而static局部变量只在定义...

    今天做题遇到的一条知识,查看百度之后许多人给的答案居然不对。


    static声明的局部变量,在程序执行前就产生,存放在内存的静态存储区,只能被赋值一次,生命周期为整个程序,而不是从声明处开始。

    它与全局变量的区别在于可见性:全局变量为文件作用域,而static局部变量只在定义它的作用域处可见。

    static局部变量默认初始值为0(数值)或空字符(字符)。

    展开全文
  • 局部变量 指再函数体定义的变量和函数的形参。函数内部定义的变量和函数的形参只能在本函数内部使用,函数之外不能使用。 全局变量 在函数体外部定义的变量称为全局变量。全局变量从定义开始可以供本源程序文件中...

    变量的作用域

    变量的作用域是指变量的作用范围,即变量再程序中可以被访问的区域。
    c语言中,每个变量都有一个有效的作用域。比如再函数内部定义的变量,不能再其他函数中引用

    局部变量

    指再函数体定义的变量和函数的形参。函数内部定义的变量和函数的形参只能在本函数内部使用,函数之外不能使用。

    全局变量

    在函数体外部定义的变量称为全局变量。全局变量从定义开始可以供本源程序文件中随后的所有函数使用。其作用域为从定义变量的位置开始到本源程序文件结束。
    在同一个源程序文件中如果全局变量和局部变量同名,在局部变量作用范围内,局部变量有效。

    变量的生存期和存储类型

    变量的生存期:指变量占有内存单元的时间。
    一个程序在内存中使用的存储空间分为三个部分:程序区、静态存储区和动态存储区。
    程序区存放指令代码。动态存储区和静态存储区存放数据。
    动态存储区主要用来存放自动类型的局部变量。
    静态存储区用来保存全局变量和静态类别的局部变量。程序开始执行时为变量分配存储区,程序执行完毕才释放这些空间。程序执行过程中变量一直占有固定的内存单元。

    局部变量的作用域与生存期

    1 auto变量:如果没有指定存储类型,均默认为auto变量。当退出函数时释放内存,离开函数后变量的值是不能保留的。

    2 register变量:程序中如果有少数变量使用频繁,则存取变量花费的时间较多。为提高执行效率,允许将局部变量的值不放在内存中,而放在CPU的寄存器中,需要时直接从寄存器存取,而不需要从内存中存取,从而提高执行效率。

    3 static局部变量(静态局部变量):局部变量在函数调用结束后其值任然保留,以便下次调用时使用。
    静态局部变量存储在静态存储区,在整个程序运行期间都不释放。静态局部变量是在编译时赋初值的,以后每次调用函数时不再重新赋初值而是保留上次函数调用结束时的值。

    展开全文
  • 局部变量及其生命周期详解

    千次阅读 2020-06-06 17:01:36
    局部变量:在函数内部或复合语句内部定义的变量,在其作用域内有效(作用域{}); 即:在一个函数内部定义的变量只在本函数范围内有效,也就是说只有在本函数内才能引用它们,在此函数外是不能使用这些变量的。在...
  • 局部变量生存期

    2009-11-18 16:21:00
    for(int i = 0;i{ int b; { //此花括号很重要,它改变量局部变量a的生存期,将其生存期限制在此花括号范围内。 int a; }}
  • 局部变量的作用域和生存周期

    千次阅读 2018-02-12 22:08:11
    变量定义的三种情况 ...将这种变量称为“局部变量”,顾名思义,这些变量的作用域仅仅是在函数内部或复合语句块内。 //复合语句块的局部变量举例 # include<stdio.h> int main(...
  • 关于c++中局部变量生存期的思考

    千次阅读 2010-04-14 15:54:00
    我想在c++中局部变量的的生存期大家都很熟悉了吧,就生存在最近的一对大括号里,出了该括号,该变量就自动销毁了。因为我们经常在阻塞模式下写代码,所以没什么问题,但是换到非阻塞下呢,比如说多线程。下面看段...
  • #include <stdio.h> const int A = 10; int a = 20; static int b = 30; int c; int main(void) { static int a = 40;...作用域(Scope)这个概念适用于所有标识符,而不仅仅是变量,C语言的作用域.
  • 存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。 作用域: 变量的可见代码域(块作用域,函数...
  • 这里讲静态局部变量c的生存期从它所在的函数开始,书上讲“如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期,获称该变量在此时刻“存在”“,似乎是说这个静态局部变量从它所在的函数开始才...
  • 不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,全局变量也是存放于程序的全局变量区域,所以它们的生命周期是从程序开始到程序结束。 它们的作用域决定于它被存放和定义的位置。
  • 可见性和生存期

    2021-01-07 19:17:48
    可见性-->编译过程:从对标识符的引用的角度来看,表示从内存作用域向外层作用域“看”时能看见什么 ...生存期只有函数被调用才有,函数结束局部变量生存期就结束了,空间被收回 作者:Nx呐!
  • 全局变量 也称外部变量,在函数体外定义。 全局变量分为外部全局变量和静态全局变量。区别:使用static存储类别的全局变量只能在被定义的源程序文件中使用,而使用extern... 所谓的生存期,是指变量占用内存或者寄...
  • 变量生存期和作用域: 静态存储区 编译时,分配内存空间 执行中,内存单元一直保持,知道程序运行结束被释放 生存期,整个程序运行期 动态存储区 程序执行到所在的函数被调用时,系统才为其分配内存空间...
  • 变量的存储方式和生存期 在C语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。对数据类型,读者已经熟知(如整形、浮点型等)。存储类别指的是数据在内存中存储方式(如静态存储和动态存储)。 ...
  • 正确 错误 解析: 局部变量存在栈区 new出的变量存在堆区 static变量和全局变量由操作系统释放
  • 第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。 第二、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中...
  • 编程入门基础 局部变量生存期 主讲教师 耿宇航 Copyright2013, All Rights Reserved 局部变量 局部变量也叫做 自动变量 栈变量 它是如何分配如何释放的 Copyright2013,, All Rights Reserved 三种情况 函数大括号 ...
  • 目录1 变量生存期和作用域2 默认初始化规则(C++11) 1 变量生存期和作用域 变量的储存方式:动态储存(自动、寄存器)、静态储存(静态和外部) 储存方式 名称 自动变量 anto 寄存器变量 register ...
  • 变量的生存期与存储类型1、变量的生存期2、变量的存储类型【1】自动变量【2】外部变量【3】静态变量内部静态...而动态存储,通常是针对局部变量而言,是指在程序运行期间,临时为其分配存储单元,使用完毕即将其销毁。
  • 1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • C++ 变量生存期

    千次阅读 多人点赞 2017-04-10 12:27:41
    变量的生存期是指其在程序运行时占用内存空间的时间段。 1. 静态生存期 ... 如:局部变量、函数的参数 3. 动态生存期  用new操作或者malloc函数来进行分配,用delete操作或者调用free函数来收回。
  • 标题:全局,局部,静态变量和变量的作用域,生存期; 内容:A.观看MOOC10.2,10.3; B(a).局部变量:定义在函数内部的变量(包括函数的形参),全局变量:定义在函数外面的变量 全局变量在所有函数中均可使用,...
  • 按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1、全局变量在整个工程文件内都有效; 2、静态全局变量只在定义它的文件内有效; 3、...
  • 几个基本概念 静态存储区: 程序运行期间系统分配的固定的存储空间。 动态存储区: 程序运行期间根据需要进行动态分配的内存空间。 静态存储区和动态存储区都在内存中。 作用域:变量可被使用的范围。...局部变量
  • 来源:公众号【编程珠玑】作者:守望先生前言这些是编程语言中的基本概念,如果你还不是非常明确地清楚标题的问题,并且不知道作用域,链接属性,存储等概念的具体含义,那么本文你...
  • 静态变量 存储在动态存储区,只能在本...静态局部变量 存储在静态存储区,只能在本文件的本函数内使用,函数结束后不释放,程序运行结束后释放 静态全局变量 存储在静态存储区,只能在本文件内使用,程序运行结束后释放
  • 静态变量生存期和作用域

    千次阅读 2008-11-23 16:56:00
    Technorati 标签: VBA,static,静态变量,生存期,作用域摘编自:http://baike.baidu.com/view/675642.htm静态变量的类型说明符是static。静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,073
精华内容 14,029
关键字:

局部变量生存期