精华内容
下载资源
问答
  • c语言静态变量
    2022-08-18 23:26:17

    静态局部变量有以下特点:
        (1)该变量在全局数据区分配内存;
        (2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
        (3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;

        (4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;

    更多相关内容
  • C语言中使用auto 关键字声明自动变量,使用static关键字声明静态变量。在函数中定义局部变量时,如果没有被声明为其他类型的变量都是自动变量。在编写代码时,有时需要在调用函数中的某个局部变量以后,这个变量的值...

    C语言中使用auto 关键字声明自动变量,使用static关键字声明静态变量。

    在函数中定义局部变量时,如果没有被声明为其他类型的变量都是自动变量。在编写代码时,有时需要在调用函数中的某个局部变量以后,这个变量的值不消失,并且保持原值不变,也就是该函数所占用的存储空间不被释放,在下次调用该函数时,变量中的值是上次调用该函数结束时变量的值。这时,使用的变量类型是静态变量,使用static 关键字进行声明。

    静态变量与自动变量的区别主要表现在:

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

    Ⅱ)静态局部变量是在编译时赋初始值,并且只赋一次初值,在以后每次调用函数时,只是使用上一次函数被调用结束时变量的值。而自动局部变量的初值不是在编译时赋予的,而是在函数调用时赋予的,每调用一次函数都会对变量重新赋一次初值。

    Ⅲ)如果调用的静态局部变量没有对其进行赋值,则该变量的默认值为0后者为空字符串。而对于自动局部变量来说,如果不赋值,则变量的值是一个不确定的值,这是因为在函数被调用时,会为该变量分配一个存储空间,在函数结束时,存储空间被释放,这两次分配的存储空间是不一样的,存储空间中的值也是不确定的。

    程序举例:

    #include  void test(){    auto a = 0;              //定义自动存储类型变量    static int b = 3;         //定义静态存储类型变量    a++;    b++;    printf("%d\n", a);        //输出a    printf("%d\n", b);        //输出b }int main(){    int i;    for (i = 0; i < 3; i++)    {        test();              //调用test函数    }    return 0;}       该程序执行的结果为: 1 4 1 5 1 6;

    在程序test函数中首先定义了一个自动存储类型变量 a 赋初值 0.定义了一个静态存储类型变量b 赋初值 3;在main 函数中,通过循环3 次调用  test 函数。在第一次调用时,a=0,b=3;执行{a++;b++;} a=1,b=4。第二次调用时,变量a的值为0,b的值为4,因为a 声明为自动变量,函数调用结束后存储空间的值被释放,因此在第二次调用时,使用的是函数的初值,变量b 被声明为静态类型的变量,在第二次调用函数是,使用第一次函数被调用结束时变量的值4,所以执行结果为 a 的值为1,b的值为5,同理,第三次调用时,变量a使用初值0,而变量b 使用的二次调用结束是的值5, 故第三次调用执行结果a 的值为1,b的值为 6

    展开全文
  • C语言静态变量详解

    千次阅读 2019-04-26 20:58:23
    Static翻译出来是“静态”“静止”的意思,在C语言中的意思其实和它的本意差不多,表示“静态”或者“全局”的意思,用来修饰变量和函数。经static修饰过后的变量或者函数的作用域或者存储域会发生变化,而由static...

    Static翻译出来是“静态”“静止”的意思,在C语言中的意思其实和它的本意差不多,表示“静态”或者“全局”的意思,用来修饰变量和函数。经static修饰过后的变量或者函数的作用域或者存储域会发生变化,而由static修饰的变量在初始值方面也会表现出static关键字的优势。想知道经static修饰过后的变量或者函数的作用域或者存储域发生了什么变化吗,发生变化的原因是什么吗?请大家继续往下看!

    一、c程序的内存分布

    既然static是用来修饰变量和函数的,而变量和函数又是组成c程序必不可少的,C程序的内存分布图如下。

    C程序由下面5部分组成:

    1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;

    2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。

    3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。

    4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
    

    5)堆——动态存储区。是向高地址扩展的数据类型,是自下向上的扩展方式。

    C语言中static变量详解 - GetYourLove - GetYourLove_Blog

    c程序内存分布图
    在这里插入图片描述

    上面的C程序分布图很明显的告诉我们,变量是存储在栈区或者堆区或者bss段或者data段,变量的存储域为什么会有所不同呢?其实原因很简单,说白了就是与他们定义在程序的不同地方,有没有static关键字修饰有关啦,定义在不同的地方也说明了他们有着不同的作用域。

    二、static修饰的变量

    1. 全局静态变量

    在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

    1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

    2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是 任意的,除非他被显示初始化)

    3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

    定义全局静态变量的好处:

    <1>不会被其他文件所访问,修改

    <2>其他文件中可以使用相同名字的变量,不会发生冲突。

    2. 局部静态变量

    在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

    1)内存中的位置:静态存储区

    2)初始化:未经初始化的局部静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

    3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

    注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。

    当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

    三、Static修饰的函数

    在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

    函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件中可见,不能被其他文件所用。
     
     定义静态函数的好处:
      <1> 其他文件中可以定义相同名字的函数,不会发生冲突

    <2> 静态函数不能被其他文件所用。
    存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。
      auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
      关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。

    四、总结

    (1)第一个作用:隐藏。

    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。

    下面是a.c的内容

    #include增加这条语句

    char a = ‘A‘; // global variable

    void msg()

    {

     printf("Hello\n"); 
    

    }

    下面是 main.c 的内容

    int main(void)

    {

    extern char a;    // extern variable must be declared before use 
    
    printf("%c ", a); 
    
    (void)msg(); 
    
    return 0; 
    

    }

    程序的运行结果是: A Hello

    你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

    如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

    (2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

    (3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

    最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。

    下面是main.c的内容

    除了头文件,需要声明函数:void msg();

    int main(void)

    {

    extern char a;    // extern variable must be declared before use
    
     printf("%c ", a);
    
     (void)msg();
    
    return 0;
    

    }

    分类: C语言基础
    好文要顶 关注我 收藏该文
    SilenceBook
    关注 - 7
    粉丝 - 5
    +加关注
    1
    0
    « 上一篇:C#委托与事件
    » 下一篇:ARM堆栈及特殊指令
    posted @ 2014-04-10 12:09 SilenceBook 阅读(15494) 评论(0) 编辑 收藏

    展开全文
  • C语言静态变量初始化问题

    千次阅读 2018-02-10 12:45:45
    以前在学习C语言中,看到了这么一行代码: static int arr[100];  这是一行很正常的代码,但是我“细心”的发现作者在使用它的时候并没有初始化。书上的解释是,用static修饰的变量会自动初始化。  为什么会...

        以前在学习C语言中,看到了这么一行代码:

        static int arr[100];

      这是一行很正常的代码,但是我“细心”的发现作者在使用它的时候并没有初始化。书上的解释是,用static修饰的变量会自动初始化。
      为什么会被初始化呢?首先我们看一段话:
    可执行程序和内存映像的区别在于:可执行程序位于磁盘上,内存映像位于内存中,可执行程序没有堆栈,可执行程序虽然也有未初始化的数据段,但是它并不存储在位于硬盘中的可执行文件中:

      我们用两个程序来检验一下这段话是否正确
      

    // withBss.c 未初始化的程序
    double a[10000];
    int main(void) {
        return 0;
    }
    
    // withoutBss 已初始化的程序
    double a[10000] = {1,};
    int main(void) {
        return 0;
    }

    这里写图片描述
      通过两个可执行文件的对比,我们发现少了大概80000(sizeof(double)×10000)个字节。那么声明的数组去哪儿了?其实static 变量只完成一次初始化,这个任务是由”链接器”完成的,在程序运行之前,它会将合适的值给变量, 如果没有初始化值, 则系统会假定认为它们的值为0,并会分配一块空间(BSS,存放程序中未初始化的全局变量的一块内存)来存放这些未初始化的变量,而这块空间也会全部被清空为0。
      
      BSS在哪儿,它是在程序的内存空间中还是系统提供的空间?

      这里写图片描述
    由图我们可以得知,BSS是在程序的内存空间中。

    展开全文
  • C语言静态变量和静态函数(转)

    千次阅读 2019-06-13 10:05:22
    全局变量以及全局变量与静态变量的关系: 顾名思义,全局变量是指能够在全局引用的变量,相对于局部变量的概念,也叫外部变量;同静态变量一样,全局变量位于静态数据区,全局变量一处定义,多处引用,用关键字...
  • C语言 静态变量static的用法

    万次阅读 多人点赞 2017-03-15 09:55:16
    第一个作用: 修饰变量变量又分为局部和全局变量,但他们都存在内存的静态区  静态全局变量,作用于仅限于变量被定义的文件。其他文件即使用extern声明也没法使用,准确说就是作用域是从定义处开始,到文件结束...
  • C语言静态变量static的分析

    千次阅读 2022-08-01 18:30:28
    本文介绍了静态变量static的作用 以及static为什么会在局部变量里面没有释放
  • C语言static静态变量详解
  • C_语言静态变量和静态函数,可以让您对C语言静态变量和静态函数有更清晰的认识
  • 本篇仍然是C语言的相关知识,主要分析了用C语言静态变量来求各个阶乘的和;当然也包括了阶乘和静态变量的相关分析 静态变量求阶乘相加 1、阶乘的概念: From“科普中国” 一个正整数的阶乘(factorial)是所有...
  • C语言中static静态变量

    千次阅读 2022-02-22 10:00:11
    静态变量的说明符是static static静态变量属于静态存储方式,其存储空间是 静态数据区(也就是存入全局存储区),静态数据区的数据在整个程序运行期间一直占用这些内存。也可以认为他的内存地址一直不变。(静态变量...
  • 局部变量:创建在栈区(向下生长),生命周期存在于...全局变量和静态变量的存储是放在一块的,初始化了的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。全局静态变量:...
  • 通过一个例子说明C语言如何初始化静态变量。给出C语言代码typedef int (* Fun)(void * obj, int argc, int *argv);struct FunctionSpec {const char *name; /* 8 */Fun call; /* 8 */unsigned char nargs; /* 1 */...
  • c语言静态函数调用静态变量 C中的静态变量 (Static Variables in C) Basically, when static variables are declared, they create only a single copy of them and are also termed as Class Variables. 基本上,...
  • ①:参数传递 ②:返回值 ③:全局变量 extern:可以在另一个文件引入全局变量,不需要做初始化的操作。 >>>>>>>>>>>>>>>>>>>>>>>>&...
  • static静态变量C语言中的作用 static 静态变量:在内存中存储在全局区,如果没有手动初始化,则其初始值为 0 1、限制作用域 当我们不希望某个变量或者函数被访问的时候,可以使用 static变量 举例:我们首先定义两...
  • c语言什么是静态变量

    2021-05-20 10:39:54
    c语言静态变量的概念定义“静态变量”这一术语有两个容易混淆的定义:语言无关的通用定义:与程序有着相同生命周期(英语:Objectlifetime)的变量;C族语言特有的定义:以存储类声明的变量。而在以Pascal为代表的许多...
  • C语言 static静态变量的作用 static c语言的变量种类 静态变量通过关键字 static 进行声明,该变量存储在数据段上,也就是内存上,可以改变变量的作用域和生命周期。 对于局部变量作用域依旧没有改变,...
  • 首先,代码如下: #include <stdio.h>...解析:在该代码中fun函数定义的a为静态局部变量,所以在第一次调用fun函数时的a的值会被保留下来,即第二次调用fun函数时的a的值是第一次调用以后的得到的
  • 静态存储区的静态变量在程序整个运行期间内都不是放空间,自动类型的局部变量属于动态存储类型,在动态存储区内分配内存,函数调用结束后,内存单元被释放。静态变量只需要有一次赋值即可,下次使用时就是上次使用后...
  • c语言static静态变量

    2021-11-02 16:17:14
    不同文件静态全局变量可以重名,但作用域不重名(意思就是同名的static全局变量可以在同一个项目的不同文件出现) static全局变量的声明周期等同于程序运行周期 2. static的局部变量 生命周期:等同与程序的运行...
  • C语言学习记录
  • C语言中的静态变量和非静态变量

    万次阅读 多人点赞 2017-11-30 15:05:52
    1.全局静态变量:在全局变量前面加上关键词static,全局变量就被定义成一个全局静态变量。 (1)内存中的位置:静态存储区。 (2)作用域:在程序任何地方都是可见的。 2.局部静态变量:在局部变量前面加上关键词...
  • C语言 动态变量和静态变量的区别

    千次阅读 2018-11-07 22:23:24
    C语言动态变量和静态变量的区别 2017年11月27日 20:21:00 guosir_ 阅读数:1586 &amp;amp;amp;amp;amp;amp;amp;amp;lt;span class=&amp;...
  • 局部变量、全局变量与生存周期
  • 全局变量、静态变量(包括上图中的“文件内部的静态变量”和“局部静态变量”)都具有静态存储期,变量的寿命周期从程序运行时即开始,到程序关闭时结束,其一直存在于内存的同一个地址上。 也就是说,可以将局部...
  • 静态变量存放在内存中的静态存储区,编译系统为其分配固定的存储空间,重复使用时,会保留变量中的值。 其定义形式为: static类型标识符变量名 静态变量分为外部静态变量与内部静态变量。外部静态变量是一种全局...
  •   变量的存储类别分有自动(动态)、静态、寄存器和外部四种,下面来说明动态和静态变量的区别。 自动(动态)变量:函数中的局部变量不加static关键字修饰就是动态变量。每次调用该函数的时,系统会给它分配存储...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 143,055
精华内容 57,222
关键字:

c语言静态变量