精华内容
下载资源
问答
  • 局部变量是静态存储还是动态
    千次阅读
    2020-05-13 10:03:05

    静态局部变量和动态局部变量区别:

    1.静态局部变量属于静态存储类别,在静态存储区分配存储单元,在整个运行期间都不释放。
    而自动变量(动态局部变量)属于动态存储类别,占动态存储空间,函数调用后释放
    2.静态局部变量在编译时赋初值,程序运次时已经有初值,以后每次调用函数不再重新赋初值而只是保留上次函数调用结束时的值。
    3.静态局部变量编译时赋初值默认是0
    而自动变量,如果不赋初值则它的值是不确定的值。
    4.静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。

    如果用static修饰全局变量,那么该全局变量不能被其他文件引用。
    不能再被extern(extern和static都是修饰符)
    如果用static修饰函数,那么该函数本文件内可以引用而其他文件不能引用。

    更多相关内容
  • 作用域 定义在函数(方法)内的变量,具有块作用域。在函数外部,不能直接使用它。 定义在函数(方法)外的变量具有文件作用域,在整个文件中main函数可以...全局变量如果是非静态的具有外部链接属性,而静态的具有.

    作用域

    定义在函数(方法)内的变量,具有块作用域。在函数外部,不能直接使用它。

    定义在函数(方法)外的变量具有文件作用域,在整个文件中main函数可以直接使用它。

    C语言中,作用域用来描述标识符能够被哪些区域访问。

    常见作用域有以下几种:

    可以看到,error标签具有函数作用域,整个函数内都可见,而temp具有块作用域,因此在大括号外部,不能直接使用它。而num1和num2具有文件作用域,因此main函数可以直接使用它。

     

    链接属性

    全局变量如果是非静态的具有外部链接属性,而静态的具有内部链接属性,只在一个文件中使用。

    局部变量不存在链接属性

    c变量有三种链接属性:

    再稍作解释,没有static修饰,且具有文件作用域的变量,他们在链接时,多个同名标识符的变量最终都绑定到同一个实体。而static修饰的具有文件作用域的变量就不一样了,不同文件内,即便标识符名字相同,它们也绑定到了不同的实体。

    因此,如果我们希望某个变量或函数只在某一个文件使用,那么使用static修饰是一个很好的做法。

    从代码中可以看到,a和b都具有文件作用域,a具有外部链接属性,而b具有内部链接属性,sum具有块作用域,因此无链接属性。

    存储期

    也分下面几种:

    静态存储方式:是指在程序运行期间分配固定的存储空间的方式。

    动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。

    同样地,我们通过下面的代码来更好地理解存储期:

    全局变量和静态变量都是静态存储方式,而动态局部变量属于动态存储方式。

    使用动态存储方式的有:

    1)函数形式参数

    2)自动变量(未加static声明的局部变量)

    3) 函数调用实的现场保护和返回地址;

     

     

    局部变量

    局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。

    关于局部变量的作用域还要说明以下几点:
    1)主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
    2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
    3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在前例中,形参和实参的变量名都为n,是完全允许的。
    4)在复合语句中也可定义变量,其作用域只在复合语句范围内。

    5)没有默认值,如果要想使用,必须手动赋值。

    6)局部变量内存的位置:位于栈内存;
     

    全局变量

    全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。如果没有赋值,会有默认值,规则和数组一样;位于堆内存;

    变量的存储类别

    动态存储方式与静态动态存储方式

    从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。

    从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。

    静态存储方式:是指在程序运行期间分配固定的存储空间的方式。

    动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。

    用户存储空间可以分为三个部分:

    1)程序区;

    2)静态存储区;

    3)动态存储区;

    全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;

    动态存储区存放以下数据:

    1)函数形式参数;

    2)自动变量(未加static声明的局部变量);

    3) 函数调用实的现场保护和返回地址;

    对以上这些数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。

    每个变量和函数有两个属性:数据类型和数据的存储类别。

    用static声明局部变量

    有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static进行声明。

    对静态局部变量的说明:

    1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放

    2)静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

    3)如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。

    展开全文
  • 全局变量,局部变量静态变量,动态变量。

    讨论变量主要从以下三点来进行分析:

    1. 变量的作用域
    2. 变量的生存周期
    3. 变量保存的空间

    从变量的作用域来区分:变量分为全局变量和局部变量

    局部变量:在函数内定义的变量,作用域限于函数内

    • 主函数定义的变量不能再其他函数中使用,主函数也不能使用其他函数定义的变量。
    • 形参变量属于被调函数的局部变量,实参变量属于主调函数的局部变量。
    • 允许在不同的函数中使用相同的变量名,但它们代表不同的对象,占用不同的存储单元,互不干扰。
    • 在复合语句中(如while、if、for等语句里面)也可以定义变量,但其作用域只能在复合语句内。

    全局变量:在函数外定义的变量,它的作用域是从变量定义开始,到程序结束

    • 如果非定义全局变量的文件中要使用该外部变量,要使用关键字extern声明变量才能够使用。
    • 全局变量能由声明的文件中所有函数都能引用全局变量的值,而在一个函数中能够改变了变量的值会对其他函数产生影响,所以在使用中需要注意变量的安全性,如果在多线程中需要全局变量则需要给全局变量操作的语句加上线程锁或者原子操作。
    • 全局变量和局部变量同名时,在函数中全局变量隐藏,局部变量起作用。

    从变量的生存周期来区分:变量分为静态变量和动态变量

    动态变量:动态变量在函数调用时分配存储空间,函数调用结束后释放存储空间。它可以是函数的形参,局部变量,函数调用时的现场保护和返回地址。

    • 动态变量使用auto关键字修饰,一般可以忽略默认为动态变量。
    • 动态变量中有使用关键字register修饰的寄存器变量,不存入内存,直接保存在CPU内的寄存器中,提高执行速度。一般把使用最频繁的变量定义为register变量,如循环变量。

    静态变量:在运行期间由系统分配固定的存储空间。它可以是全局变量,也可以是局部变量。

    • 静态变量使用关键字static修饰分为静态局部和静态全局。
    • 静态局部变量:它和局部变量的区别在于函数退出时,变量始终存在,但不能被其他函数使用,当再次进入该函数时,能保存上次的结果继续使用。如果不赋初值,则自动赋初值0或空字符。
    • 静态全局变量:只在定义它的源文件中可见,在其他源文件中不可见。它和全局变量的区别是,全局变量可以使用关键字extern被其他源文件使用,而静态全局变量不能。

    从变量存放的空间来分析

    局部变量: 栈区
    局部静态变量:静态区
    全局变量: 静态区
    全局静态变量:静态区

    C语言分为五大内存分区:

    • 栈区(stack): —由编译器自动分配释放,存放函数的参数值,局部变量的值等。
    • 堆区(heap): 一般由程序员分配释放,若程序员不释放,程序结束时由系统释放,C语言中使用malloc、calloc、realloc动态分配堆的空间,使用free释放空间。
    • 全局区(静态区,static):
      全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
    • 文字常量区: 常量字符串就是放在这里的,如数字,字符串等。程序结束后由系统释放。
    • 程序代码区: 存放函数体的二进制代码。
    展开全文
  • 一:局部变量、全局变量、静态存储动态存储关系 变量的分类: ①从空间上分配:从变量的作用域可以分成:局部变量和全局变量。 ②从变量的存在时间(生存周期)可以分成:静态存储动态存储。 局部变量...

    一:局部变量全局变量静态存储动态存储关系

    变量的分类:

    ①从空间上分配:从变量的作用域可以分成:局部变量和全局变量。

    ②从变量的存在时间(生存周期)可以分成:静态存储和动态存储。

    局部变量(Local Variable):定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。再调用就是出错。

    全局变量(Global Variable):定义:所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件。

    内存中供用户使用的存储空间分为三部分:程序区 、静态存储区、动态存储区。

    静态存储:程序在运行期间分配固定的存储方式。

    动态存储:程序在运行期间根据需要动态的分配存储空间。

    变量与存储关系:

    全局变量全部存储在静态存储区。在程序开始执行过程中给全局变量分配空间,程序执行完毕就释放空间。程序执行过程中固定的分配空间,而不需要动态进行分配是释放。

    动态存储区主要存放以下数据:函数的形参、自动变量(没有加static的局部变量)、函数调用的现场现场保护和返回值。动态存储区的数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。

    C语言中每个变量有两个属性:第一数据类型;第二存储属性。

    auto 变量:

    函数中的局部变量,如果不专门的声明为 static存储,都是动态分配存储空间。数据存储在动态存储区内。函数中的形参和函数中的变量都属于此类,调用该函数时候系统自动的分配空间,在函数结束的时候,释放该空间。这些局部变量被称为自动变量。自动变量用 auto关键字声明(可以省略auto )。

    static 变量:

    有时候希望我们调用的函数在释放的时候不消失能保留原值,这就需要定义为静态局部变量。用关键字 static声明。

     

    对静态局部变量的说明:
    1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
    2)静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
    3)如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。

    用extern声明外部变量
    外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

    extern 例子:

     

    在 main 函数体外定义的变量,A 、B(外部变量:它的作用域为从变量定义处开始,到本程序文件的末尾。)。想要在main中引用必须加关键字:extern 。

    二:堆、栈与变量存储关系

    栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。

    堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。

     

      所以堆与栈的区别很明显:

                1.栈内存存储的是局部变量而堆内存存储的是实体;

                2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

                3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

    三:变量与可执行文件关系

    如果不需要使用就不要定义全局变量,因为只要定义了,代码又参与编译就会分配内存,局部变量定义了编译程序还帮着分析变量有无被使用并提示未被使用的变量,而全局变量则不会被分析是否有被使用,所以要小心使用,少做无谓的浪费,
    全局变量能占用的总空间数是有限的,超过限度时编译器会提示且拒绝链接,不能生成最终执行文件

     

                                                                                                                     

     

    阅读更多

    展开全文
  • 1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • 来源:公众号【编程珠玑】作者:守望先生前言这些是编程语言中的基本概念,如果你还不是非常明确地清楚标题的问题,并且不知道作用域,链接属性,存储期等概念的具体含义,那么本文你...
  • 如果定义成局部变量,则必须定义成静态局部变量静态局部变量是在编译时赋初值的,只赋初值一次,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
  • 局部变量:在函数内定义的变量,作用域限于函数内。 说明:(1)主函数定义的变量不能再其他函数中使用,主函数也不能使用其他函数定义的变量。 (2)形参变量属于被调函数的局部变量,实参变量属于主调函数的局部...
  • 局部变量、全局变量、静态变量

    千次阅读 2019-09-16 09:52:33
    局部变量 定义:局部变量指在程序中只在特定过程或函数中可以访问的变量。换言之,在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些...
  • 局部变量、全局变量和静态变量之间的区别 (1)局部变量 定义: 在一个函数内部定义的变量是局部变量,它只在本函数范围内有效。 1.主函数main定义的变量也只在主函数有效; 2.不同函数中可以使用名字相同的变量,...
  • 静态变量,全局动态变量都是静态存储, 存储在全局数据区,在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。静态存储变量是一直存在的,只会初始化一次。 2.2动态存储 局部动态变量动态存储, 动态...
  • 静态局部变量静态全程变量static。

    万次阅读 多人点赞 2019-01-01 13:28:04
    static 是 C/C++ 中很常用的修饰符,它被用来控制变量存储方式和可见性。 1.1 static 的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此...
  • 存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1、全局变量在整个工程文件内都有效; 2、静态全局变量只在定义它的文件内有效; 3、静态...
  • 变量可以分为全局变量、静态全局变量、静态局部变量局部变量存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分:全局变量在整个工程文件内都...
  • 静态局部变量

    千次阅读 2021-01-07 09:59:47
    静态局部变量局部变量前加上“static”关键字,就成了静态局部变量。...静态局部变量局部变量存储位置上不同,使得其存在的时限也不同,导致对这两者操作 的运行结果也不同。 对静态局部变量
  • static变量(包括static全局变量和static局部变量) 在没有static关键字出现前,只能用全局变量来实现static的功能,之后static不仅实现了全局变量的功能,还做到了可以限制变量的使用范围。 存储在静态存储区的...
  • C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register) 1----局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量...
  • 根据定义变量位置的不同,可以将变量分为成员变量和局部变量。 成员变量是 定义在一个类的变量:类中方法外 局部变量是定义在一个方法内的变量:方法中 成员变量分为: 静态属性:随类的存在而存在,是在类加载的...
  • 静态变量动态变量 全局和局部

    千次阅读 2019-03-24 18:25:37
    静态存储动态存储 1)静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。静态变量,全局动态变量都是静态存储 2)动态存储变量是在程序执行过程中...静态局部变量动态局部变量的...
  • 存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1、全局变量在整个工程文件内都有效; 2、静态全局变量只在定义它的文件内有效; 3、...
  • 局部变量又包括静态变量(STAT)和临时变量(TEMP)两种。、静态变量(STAT)在PLC运行期间始终被存储。S7将静态变量定义在背景数据块(针对FB而言,FC和OB无静态变量),当被调用块运行时,能读出或修改静态变量;被调用块...
  • 局部变量保存在动态数据区的栈中,只有在所在函数被调用时才动态地为变量分配存储单元。  1).主函数main中定义的变量也只在主函数中有效.  2).不同函数中可以使用名字相同的变量,它们代表不同的对象,互不干扰.
  • 局部变量在函数的开头定义在函数内的符合语句内定义作用范围在包含该局部变量的函数内有效一个函数内部,可以在复合函数语句中定义变量,这些变量只在本复合语句中有效,这种符合语句称为分程序或程序块 #include<...
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • 1、bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。bss段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户...
  • 区分静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)静态变量、动态变量、内部变量(局部变量)、外部变量(全局变量)变量的分类来看 静态变量、动态变量、内部变量(局部变量)、外部变量(全局...
  • 二、局部变量 1、局部变量声明在方法中。 2、局部变量没有默认值,在使用之前必须初始化。 三、静态变量 1、静态变量是共享的,同一个类所有的实例共享一份静态变量。 2、静态变量会在类的任何静态方法执行之前...
  • 常见的存储区域可分为: ...里面的变量通常是局部变量、函数参数等。 2、堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,...
  • 下面有几种网上的理解,我整理一下:一: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员...
  • 我们知道在C++中的变量根据定义的位置的不同生存周期,具有不同的作用域。具体分为6种:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 221,460
精华内容 88,584
关键字:

局部变量是静态存储还是动态