精华内容
下载资源
问答
  • 局部静态变量和全局变量的初始化
    2022-06-06 09:55:55

    1、这些变量的存储位置

    • 全局变量和(所有类型的)静态变量都存储在全局(或称静态)数据区。
    • 全局变量和(所有类型的)静态变量如果没有提供初始值,则由编译器初始化为0(如果是类的话调用默认构造函数)。

    在全局数据区,内存中所有的字节默认值都是0x00。

    2、何时发生初始化 和 内存分配

    先明确:这些变量的内存分配和初始化都是一起进行的,没有分开。

    • 静态全局变量、全局变量 和 类的静态数据成员都在编译时,即,程序运行前完成内存分配并初始化。
    • 静态局部变量则是在第一次使用到的时候分配内存并初始化。

    3、静态局部变量的特点

    • 静态局部变量的生命期是整个程序的生命期。 静态局部变量在该函数调用结束时,不会销毁,而是随整个程序结束而结束。
    • 但是别的函数调用不了该变量。
    • 只在第一次用到的时候初始化一次,以后每次函数调用时,不在赋初始值,而是使用上次函数调用结束时的值

    C/C++中全局变量,静态局部变量,局部变量的初始化问题

    更多相关内容
  • 静态局部变量的特点: 1.不会随着函数的调用退出而发生变化,不过,尽管该变量还...虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。复制代码 代码如下:functio
  • 首先,静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在CC++中静态局部变量的初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配...

    全局变量、static变量初始化时间

    静态局部变量

    首先,静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点又有点不太一样。

    在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到在C语言中无法使用变量对静态局部变量进行初始化,在程序运行结束,变量所处的全局内存会被全部回收。

    而在C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作,并非简单地分配内存。所以C++标准定为全局或静态对象是有首次用到时才会进行构造,并通过atexit()来管理。在程序结束,按照构造顺序反方向进行逐个析构。所以在C++中是可以使用变量对静态局部变量进行初始化的。

    全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。

    全局变量

    根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量的初始化可以划分为以下两个阶段(c++11 N3690 3.6.2):

    不要写出和编译顺序相关的程序

    对于不同编译单位的全局变量,其初始化的顺序没有任何的保证,因此对不同编译单位里的全局变量,在它们的初始化顺序之间建立依赖性都是不明智的。此外也没办法捕捉到全局变量初始化抛出的异常,一般来说要减少全局变量的使用,特别是限制那些要求复杂初始化的全局变量。so:
    1、尽量不用全局变量
    2、用静态变量,通过访问器进行访问
    例如:全局变量

    int   a   =   5;  
    int   b   =   a;  
    

    如果a,和b定义在同一个文件里,那没什么问题,结果b等于5。如果a和b定义在不同文件里,就不能保证b也等于5,也就是说不能保证a先初始化。事实上,除了在同一个文件定义的全局对象的初始化是按照定义次序来进行的之外,其他全局或静态变量之间的初始化次序没有任何保障。解决这种问题的方法是不直接使用全局变量,而改用一个包装函数来访问,例如

      int   get_a()  
      {  
              static   int   a   =   5;  
              return   a;  
      }  
      int   get_b()  
      {  
              static   int   b   =   get_a();  
              return   b;  
      }   
    

    这样的话,无论get_a和get_b是否定义在同一个文件中,get_b总是能够返回正确的结果,原因在于,函数内部的静态变量是在第一次访问的时候来初始化。

    任何时候,如果在不同的被编译单元中定义了"非局部静态对象",并且这些对象的正确行为依赖于它们被初始化的某一特定顺序,就会产生问题。你绝对无法控制不同被编译单元中非局部静态对象的初始化顺序。对于函数中的静态对象(即"局部"静态对象)它们在函数调用过程中初次碰到对象的定义时被初始化…

    总结

    1、静态变量的初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。
    2、静态变量只初始化一次,但可以通过赋值的方式多次修改静态变量的值。
    3、全局变量和静态变量 在进入 main 前被初始化

    展开全文
  • 参考:全局变量,static变量初始化时间 通过图片可以得到简单结论; 静态局部变量的初始化:调用的时候初始化且只初始化一次。 静态全局变量的初始化:于main函数之前初始化。

    参考:全局变量,static变量初始化时间

    通过图片可以得到简单结论;

    静态局部变量的初始化:调用的时候初始化且只初始化一次。

    静态全局变量的初始化:于main函数之前初始化。

    在这里插入图片描述

     

    展开全文
  • 还有对全局变量是不是也是编译赋初值?没有初值是不是自动给它赋值(网上好像有这么讲的),那什么时候在内存开辟空间呢(这个图上的生存期从main函数就开始)? 这些可能涉及计算机组成原理,我没学过,希望哪位...
  • 局部变量、全局变量静态变量

    千次阅读 2019-09-16 09:52:33
    局部变量 定义:局部变量指在程序中只在...定义:在函数外定义的变量是外部变量,外部变量就是全局变量全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束。 局部变量与全局变...

    局部变量

    定义:局部变量指在程序中只在特定过程或函数中可以访问的变量。换言之,在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量。

    全局变量

    定义:在函数外定义的变量是外部变量,外部变量就是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束。

    局部变量与全局变量的区别

    局部变量可以与全局变量重名,但是局部变量会屏蔽全局变量。在函数体内引用变量会用到同名的局部变量而不是全局变量,对于一些编译器来说,在同一个函数体内可以定义多个同名的局部变量。例如我们可以在一个函数内部,在两个循环中都定义同名的局部变量i,而局部变量i的作用域在那个循环体内。
    1.作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等;

    2.内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区;

    3.生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了;

    4.使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量

    特别注意:局部变量不能赋值为与全局变量同名的值

    静态变量:

    定义:在程序运行期间分配固定的存储空间的变量,叫做静态变量 。
    关键字:static
    特别说明:静态变量自然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量;对于自动变量,它属于动态存储方式, 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。

    特点:

    (1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

    (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

    (3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符

    (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

    三者区别:

    一、从作用域看:

    C++变量根据定义的位置的不同的生命周期,具有不同的作用域,可分为:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

    1.全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

    2.局部变量具有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

    3.静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见

    4.静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

    二、从分配内存空间看:

    1.全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在里分配空间

    2.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,**当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。**而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

    Tips:

    A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

    B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

    C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;

    D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)

    E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

    展开全文
  • 全局变量和静态变量初始化总结

    千次阅读 2022-03-28 10:43:32
    【可以直接理解成在main函数执行前就初始化好】但这个初始化可细分为:编译时初始化和运行时初始化,即static initialization和dynamic initialization。 static initialization: 静态初始化,是针对于那些简单的...
  • 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化全局变量和静态变量在一块区域(.data),未初始化全局变量和初始化静态变量在相邻的另一块区域(.bss)。 – 程序结束后由系统...
  • 1.全局变量初始化在主函数之前 2.静态局部变量初始化在第一次调用这个静态局部变量之前 #include <iostream> using namespace std; class A { public: A(int a):m_a(a){cout << "A(int a):" << ...
  • 在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量...静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(这一点非常的重要);静态局部变量一般在声明处初始化
  • 1.全局静态变量只能被当前源文件引用,不能被工程里其它源文件引用。 除了这点特殊,其它与普通的全局...2.局部静态变量,只执行一次初始化,只能被所在函数引用,函数执行 完毕,变量仍存在,生存周期贯穿整个程序。
  • 1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • 比如如下程序代码片段 int a = 0 ;...a 全局初始化变量 ...p1 全局未初始化变量 ...x 全局静态变量 ...b 局部变量 ...s1 局部变量 ...p2 局部变量 ...s2 局部变量 ...全局变量同一个文件中先定义先初始化,不同不确定
  • C++局部变量和全局变量初始化

    千次阅读 2020-03-02 23:17:18
    局部变量被定义时,系统不会对其初始化,此时局部变量的初始值未定义,必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:
  • 局部变量:创建在栈区(向下生长),生命周期存在于...全局变量和静态变量的存储是放在一块的,初始化了的全局变量和静态变量在一块区域,未初始化全局变量和初始化静态变量在相邻的另一块区域。全局静态变量:...
  • 局部变量、全局变量和静态变量之间的区别

    千次阅读 多人点赞 2021-01-23 11:37:22
    局部变量、全局变量和静态变量之间的区别 (1)局部变量 定义: 在一个函数内部定义的变量是局部变量,它只在本函数范围内有效。 1.主函数main定义的变量也只在主函数有效; 2.不同函数中可以使用名字相同的变量,...
  • 全局变量和静态(全局和局部)变量 什么时候初始化? 本文链接:https://blog.csdn.net/sunny04/article/details/18605273 1. 静态变量初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。 2. 静态变量只...
  • 1.全局变量 全局变量无疑要在main函数开始前执行完成,但可细分为在编译时在运行时初始化,即static initializationdynamic initialization。 static initialization 静态初始化按照我的理解,是针对那些较为...
  • 什么全局变量局部变量,静态局部变量,静态全局变量 到这里,我们就可以很容易区分上面的变量类型了。实际上这里只是换了一种说法: 全局:具有文件作用域的变量 静态:具有静态存储期或内部链接属性 局部:具有...
  • 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用”::” 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,...
  • 数据段又分为:.data 段 .bss段,其中.data段存储已初始化全局变量和静态变量,.bss 段存储未初始化全局变量。在C中,凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类...
  • 静态变量全局变量初始化静态和全局变量初始化默认初始化规则 静态和全局变量初始化初始化全局变量和静态变量 编译器会同等处理, 放入BSS段(这是全零的内存段),所以会被默认初始化为0 默认初始化...
  • static 静态变量 一般在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈区分配空间,函数在栈区分配的空间在此函数执行结束时会释放掉。 这样就产生了一个问题: 如果想将函数中此变量的值保存至下...
  • 静态局部变量、静态全局变量静态函数(静态局部变量只被初始化一次,保留变量值、静态全局变量是加了作用域的全局变量静态函数亦是加了作用域的函数)
  • 1、bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化全局变量的一块内存区域,在程序载入时由内核清0。bss段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户...
  • 定义全局变量时,默认初值全是0,原因是全局变量放在堆区,这里由编译器统一初始化,即编译时候编译器统一把它们弄为0了 定义局部变量时,默认初始是随机的,因为局部变量的定义是在栈区,这个是程序运行起来后,...
  • (除了加static 前缀的局部变量,因为此时的局部变量是放在静态存储区内的,跟全局变量一样) 解释:局部变量是存在栈中,数据量大,且生命周期短,若为局部变量进行初始化,开销很大。 -------所以,我们在定义局部...
  • 静态变量的内存分配和初始化对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收...
  • 什么时候初始化 根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法...答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量初始化可以划分为以下两
  • 参考: ... 跨模块(文件)的全局变量初始化顺序无法保证!!!!这将导致存在前后依赖的变量问题十分麻烦。 全局变量在多线程中,特别容易出错!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 237,554
精华内容 95,021
热门标签
关键字:

局部静态变量和全局变量的初始化