精华内容
下载资源
问答
  • 主函数内部定义完之后就进行了初始化,均初始化为1,所以在do-while内部,可以看到由于只定义了静态局部变量x,而且没有初始化赋值,则静态局部变量x为0,y,z,w均仍为1。所以  printf("%d#%d#%d#%d#",x,y,z,w); ...

    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
     

    展开全文
  • 存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。 作用域: 变量的可见代码域(块作用域,函数...

    首先要理解生存周期与作用域的区别:

    生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。

    作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。

    static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。可以认为static变量的作用域<=生存周期。

    举一个局部声明的例子。在函数test中声明静态变量i:

    void test()

    {

    int m=3;

    static int i=5;

    }

    局部变量m存放在栈中,当test函数结束,m将被销毁;静态变量i不存放在栈中,而是存放于程序的全局变量区域,因此随着函数test的结束,它并不随着出栈操作而被销毁,它的生存周期存在于程序的整个运行期;然而m和i的作用域都仅存在于test函数中它们的定义之后,即test调用结束之后,m和i就不再可用,但是i仍存在于内存之中。

    展开全文
  • 这里讲静态局部变量c的生存期从它所在的函数开始,书上讲“如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期,获称该变量在此时刻“存在”“,似乎是说这个静态局部变量从它所在的函数开始才...
  • 不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,全局变量也是存放于程序的全局变量区域,所以它们的生命周期是从程序开始到程序结束。 它们的作用域决定于它被存放和定义的位置。

    全局变量、静态变量、局部变量的生存周期与作用域

    1、生存周期和作用域的定义1

    生存周期: 变量从定义到销毁的时间范围。存放在全局数据区的变量的生存周期存在于整个程序运行期间,而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁,除了静态变量之外的局部变量都存放于栈中。取决于变量存放位置
    作用域: 变量的可见代码域(块作用域,函数作用域,类作用域,程序全局作用域)。取决于变量定义位置

    2、不同类型变量的生存周期和作用域2

    1)全局变量:

    生命周期:程序运行期一直存在,从程序开始到程序结束;
    作用域:全局作用域(只需要在一个源文件中定义,就可以作用于所有的源文件);
    引用方法:其他文件如果要使用,必须用extern 等关键字声明要引用的全局变量;
    内存分布:全局(静态存储区)。
    注意:如果再两个文件中都定义了相同名字的全局变量,则连接错误:变量重定义。

    2)静态变量

    static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。可以认为static变量的作用域<=生存周期。 静态全局变量与静态局部变量的区别仅是作用域不同。

    (1)全局声明 静态全局变量:

    生命周期:程序运行期一直存在,从程序开始到程序结束;
    作用域:文件作用域(只在被定义的文件中可见:static的一个作用就是隐藏)
    内存分布:全局(静态存储区)。
    定义方法:static关键字,const关键字(注意C/C++意义不同)
    注意:只要文件不相互包含,两个不同的文件中是可以定义完全相同的两个全局静态变量的。
    举个例子:
    在文件A 中定义静态变量j:

    int n=3; //默认为extern
    static int j=5; //声明为static
    

    全局变量和静态变量j都存放于程序的全局数据区域,它们的生存周期都是程序的整个运行期,但是n的作用域为全局作用域,可以通过extern在其他文件中使用,而j只能在文件A中使用,例如在文件B中:

    extern int n; //ok
    extern int j; //error: j在文件B中不可见
    int a=n;//ok:但这里有个初始化先后的问题,具体参见参考一
    int b=j;//error
    

    也就是说,在声明全局的static变量时,static没有改变它的生存周期,也即存储位置(因为全局变量本来就存储在全局数据域),而是将变量的作用域限制在当前文件中。1

    (2)局部声明 静态局部变量:

    生命周期:程序运行期一直存在;
    作用域:局部作用域(只在局部作用域可见,超过其作用域便无法被引用)
    内存分布:全局(静态存储区)。
    定义方法:局部作用域中用static定义。
    注意:只被初始化一次,多线程中需要加锁保护。

    举一个局部声明的例子。在函数test中声明静态变量i:

    void test()
    {
    int m=3;
    static int i=5;
    }
    

    局部变量m存放在栈中,当test函数结束,m将被销毁;静态变量i不存放在栈中,而是存放于程序的全局变量区域,因此随着函数test的结束,它并不随着出栈操作而被销毁,它的生存周期存在于程序的整个运行期;然而m和i的作用域都仅存在于test函数中它们的定义之后,即test调用结束之后,m和i就不再可用,但是i仍存在于内存之中。1

    3)局部变量:

    生命周期:随着函数的结束,即被销毁。
    作用域:局部作用域(只在局部作用于可见)
    内存分布:栈区
    定义方法:在局部作用域中用auto指示符定义,可省略auto

    总结3

    全局变量、局部变量、全局静态变量、局部静态变量的区别。要从分配内存的位置和作用域入手来解释。

    全局变量,分配的内存在静态存储区内存上面,其作用域是全局作用域,也就是整个程序的生命周期内都可以使用,同时,有些程序并不是由一个源文件构成的,可能有许多个源文件构成,全局变量只要在一个文件中定义,就可以在其他所有的文件中使用,当然,必须在其他文件使用extern关键字声明该变量。

    局部变量,分配内存是分配在栈存储区上的,其作用域也只是在局部函数内,在定义该变量的函数内,只要出了该函数,该局部变量就不再起作用,该变量的生命周期也只是和该函数同在。

    全局静态变量,分配的内存与全局变量一样,也是在静态存储内存上,其生命周期也是与整个程序同在的,从程序开始到结束一直起作用,但是与全局变量不同的是,全局静态变量作用域只在定义它的一个源文件内,其他源文件不能使用它。

    局部静态变量,分配的内存也是在静态存储内存上的,其第一次初始化后就一直存在直到程序结束,该变量的特点是其作用域只在定义它的函数内可见,出了该函数就不可见了。


    1. 参考 博客园 bigclould:static作用:静态变量的生存周期和作用域 ↩︎ ↩︎ ↩︎

    2. 参考 博客园Stephen_Hsu:生命周期,作用域的定义;说明全局变量、静态变量、局部变量、const变量的生命周期、作用域 ↩︎

    3. 浅谈内存分配方式以及堆和栈的区别(很清楚)
      ↩︎

    展开全文
  • 正确 错误 解析: 局部变量存在栈区 new出的变量存在堆区 static变量和全局变量由操作系统释放

    正确
    错误

    解析:
    局部变量存在栈区
    new出的变量存在堆区
    static变量和全局变量由操作系统释放

    展开全文
  • 1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • 静态变量生存期和作用域

    千次阅读 2016-12-18 16:08:19
    静态变量的类型说明符是static。静态变量当然是属于静态存储方式,但是属于静态存储...但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。由此看来,一个变量可由static进行再说明,
  • 代码来自学堂在线的清华大学的... //a, b为静态局部变量,具有全局寿命,局部可见,只第一次进入函数时被初始化 static int a = 2; static int b; //c为局部变量,具有动态生存期,每次进入函数时都初始化 int c =
  • 按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1、全局变量在整个工程文件内都有效; 2、静态全局变量只在定义它的文件内有效; 3、...
  • 今天被问到了一个问题:如何让请求的类延迟释放如果要延迟释放或者在程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例。用单例本质上用的是静态变量。单例的写法如下:+ (instancetype)...
  • c++静态变量生存期

    2019-02-17 21:55:00
    静态局部变量存在全局数据区,他直到函数结束也不会消失 ,每次重新调用声明静态变量的函数时,也不会为其重新分配空间,它始终保留在全局数据区,直到程序运行结束 程序一开始运行,生存期就开始了,而且它是在...
  • C语言--静态局部变量

    2020-10-05 09:14:29
    静态局部变量也是定义在函数内部的,静态局部变量定义时前面要加static关键字来标识,静态局部变量所在的函数在多调用多次时,只有第一次才经历变量定义和初始化,以后多次在调用时不再定义和初始化,而是维持之前上...
  • 来源:公众号【编程珠玑】作者:守望先生前言这些是编程语言中的基本概念,如果你还不是非常明确地清楚标题的问题,并且不知道作用域,链接属性,存储等概念的具体含义,那么本文你...
  • 全局变量、局部变量静态...的区别从作用域看:从分配内存空间看:Tips 原文链接:Runoob, C++变量作用域_author: %fs. C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为 6 种:全局作用域...
  • 标题:全局,局部,静态变量和变量的作用域,生存期; 内容:A.观看MOOC10.2,10.3; B(a).局部变量:定义在函数内部的变量(包括函数的形参),全局变量:定义在函数外面的变量 全局变量在所有函数中均可使用,...
  • C语言 局部变量与全局变量的生存期

    千次阅读 2019-08-01 19:56:29
    1.局部变量 仅仅在定义它的函数的内才能有效使用,其作用域仅限在函数体内,即从变量定义的位置开始,到函数体结束。 2.局部变量的内存分配: 通常,编译器不为局部变量分配内存单元,而是在程序运行中,当局部...
  • 静态局部变量生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量,退出该函数后,尽管该变量还继续存在,但不能使用它。 静态变量与之相对应的是在运行时只暂时存在的...
  • 概念首先得明白局部变量,静态局部变量,全局变量,静态全局变量这几个概念,以下面程序举例://main.cpp int a = 0; //全局变量 static int b=0;//静态全局变量 main() { int c; //局部变量 static int d;//静态...
  • 下面有几种网上的理解,我整理一下:一: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员...
  • 变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态 存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个...
  • 转自http://hi.baidu.com/jxq61/item/78353bec06149c0f570f1d8f 一 局部变量: 在函数体内声明的变量, 称为 局部变量. 二 自动局部变量与静态局部变量 局部变量在声明时, 在类...
  • 全局变量、局部变量、静态全局变量、静态局部变量的区别  C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用...
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。...2>局部变量也只有局部作用域,它是自动对象(a
  • 使用static声明的局部变量生存期

    千次阅读 2016-03-24 16:19:19
    static声明的局部变量,在程序执行前就产生,存放在内存的静态存储区,只能被赋值一次,生命周期为整个程序,而不是从声明处开始。 它与全局变量的区别在于可见性:全局变量为文件作用域,而static局部变量只在定义...
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。...2>静态局部变量具有局部作用域
  • 1. static 变量  静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式,但...(1)静态局部变量在函数内定义 它
  • 静态局部变量和全局变量的区别!

    万次阅读 多人点赞 2017-09-09 20:45:33
    静态局部变量和全局变量的区别!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,577
精华内容 11,830
关键字:

静态局部变量的生存期