精华内容
下载资源
问答
  • 类成员函数中静态局部变量

    千次阅读 2018-04-25 10:12:36
    类成员函数中静态局部变量同样属于此类该函数,而不属于某个对象
    类成员函数中的静态局部变量同样属于此类该函数,而不属于某个对象
    展开全文
  • C++ 类的成员函数中静态局部变量

    千次阅读 2018-10-22 18:43:52
    class A { public: A(){} ~A(){} int GetStaticNum(); }; ...int A::GetStaticNum() ...//静态局部变量属于该方法,与类的实例无关 i++; return i; } int main() { A a,b; int i1 = a.GetStaticNum();//i1=1 ...
    class A
    {
    public:
    	A(){}
    	~A(){}
    	
    	int GetStaticNum();
    };
    
    int A::GetStaticNum()
    {
    	static int i = 0;//静态局部变量属于该方法,与类的实例无关
    	i++;
    	return i;
    }
    
    int main()
    {
    	A a,b;
    	int i1 = a.GetStaticNum();//i1=1
    	int i2 = a.GetStaticNum();//i2=2
    	int i3 = b.GetStaticNum();//i3=3
    
    	return 0;
    }

     

    展开全文
  • 局部变量str定义静态变量 static char str[3] = “wei”; 静态变量存放全局/静态存储区,不会因为函数运行结束而消失。 #include int main( void ) { void fun( char **p); int *p1 = NULL; ...

    #include <stdio.h>
    int main(void)
    {
        void fun(char **p);
        char arr[3] = {lis};
        char *p1 = arr;
        fun(&p1);
        printf("%s\n",p1);
    }
    
    void fun(char **p)
    {
        char str[3] = "wei";
        *p = str;
        return ;
    }

    程序运行结束后,打印的结果是什么? wei吗,不是 为什么呢?
    当fun()函数运行结束后,p1将指向变量str,但此时局部变量str内存已经释放,所以得到的结果是随机的。

    解决办法:
    把局部变量str定义成静态变量 static char str[3] = “wei”;
    静态变量存放在全局/静态存储区,不会因为函数运行结束而消失。

    #include <stdio.h>
    int main(void)
    {
        void fun(char **p);
        int *p1 = NULL;
        fun(&p1);
        printf("%d\n",*p1);
        return 0;
    }
    
    void fun(char **p)
    {
        int i = 5;
        *p = &i;
        return ;
    }

    运行结果 5 按照前面例子来说局部变量i在函数运行完后应该被释放了,为什么p还可以访问i的地址,并且输出的值也是正确的呢。

    其实这时候i的地址已经释放,只是这时候系统没有修改它,内容还在,下面通过让系统申请内存来观察i中保存的值

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    int main(void)
    {
        void fun(char **p);
        int *p1 = NULL;
        fun(&p1);
        printf("%d\n",*p1);//打印出来是5
        int *ptr = (int*)malloc(sizeof(int)*10);
        memset(ptr,1,sizeof(int)*10);
        printf("%d\n",*p1);//此处打印出来的值不一定是5,但也不一定        是1
        return 0;
    }
    
    void fun(char **p)
    {
        int i = 5;
        *p = &i;
        return ;
    }
    展开全文
  • 1. static 变量  静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式,但...(1)静态局部变量在函数定义 它

    c语言中需要内存来存放数据。而内存主要分为两类:静态存储区和动态存储区;

    1.静态存储区分为:只读数据(READONLY  DATA)区、读写数据(RW DATA)区、未初始化区(BSS)。它们都是在程序编译连接阶段确定的,在程序执行的阶段不会改变。

    2.动态存储区分为堆和栈。都是程序执行的过程中动态分配的,大小也随之动态变化。从内存管理的实现的角度看来,堆使用的链表实现的,而栈使用的是线性存储的方法。

    栈:栈是先进后出,实际的操作中,栈内存可以有满栈和空栈的情况,满栈的情况下,栈指针当前的位子是已经使用的的栈区域;空栈的情况是,栈指针当前的位子是没有使用的栈区域,所以两种情况的出入栈,指针和数据的操作先后顺序是不同的。
    满栈时:入栈,是先移动指针,在放入数据;出栈则是先出数据,在移动指针;
    空栈时:入栈,是先放入数据,在移动指针。出栈则是先移动指针,在出数据;

    C语言必须注意的几个问题:
    1.内存泄露:申请一块内存,但没有释放,程序结束也没回收,导致其他程序不能使用
    2.野指针:指一个内存指针已经被释放free或者realloc,但指针依然在使用。避免野指针的情况,将内存的指针置为NULL,并在程序使用的时候判断该内存是否为NULL,如为空,则认为该内存已经释放,不对内存进行访问。
    3.非法释放内存:原则上讲只有被malloc(),calloc()或realloc()分配并通过返回值返回返回的内存才能被释放,否则释放除此以外的内存都是非法的。即使有一个指针是*p是malloc,那么对p1=p++,这个时候free(p1)也是不合法的,但free(p)确实可以的。同样释放函数中的局部变量也是非法的.还有一种情况是,对一个堆内存释放两次也是错误的用法。因为free()函数是不能释放未分配的堆内存。在程序使用free释放内存之后,应该将指针置为NULL,free一个NULL地址是没有问题的。

    1.  static 变量

      静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

    2. 静态局部变量
      静态局部变量属于静态存储方式,它具有以下特点:
    (1)静态局部变量在函数内定义  它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

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

    3.静态全局变量
      全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局 变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在 定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此 可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量 后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

    4. static函数

    内部函数和外部函数:当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。

    (1) 内部函数(又称静态函数)
      如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:
        static  函数类型  函数名(函数参数表)
          {……}
      关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

    外部函数
      外部函数的定义:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:
        [extern]  函数类型  函数名(函数参数表)
          {……}
    调用外部函数时,需要对其进行说明:
    [extern]  函数类型  函数名(参数类型表)[,函数名2(参数类型表2)……];

    [案例]外部函数应用。
    (1)文件mainf.c
      main()
       {  
    extern void input(…),process(…),output(…);

        input(…);  process(…);  output(…);

        }

    (2)文件subf1.c
      ……
      extern  void input(……)                           /*定义外部函数*/
      {……}

    (3)文件subf2.c
      ……
      extern  void process(……)                     /*定义外部 函数*/
      {……}
    (4)文件subf3.c
      ……
      extern void output(……)                        /*定义外部函数*/
      {……}

    展开全文
  • 1全局变量 定义在函数外,不属于任何函数,生存周期为定义开始直到程序运行结束,作用范围为所有函数。 2局部变量 一般定义在函数或复合语句的开头,...其赋初值只会在函数次调用时起作用,若没有赋值,自动赋值为0
  • 函数中定义静态变量,虽多次调用函数,但只定义一次!!!!  少废话,先上代码 #include using namespace std; class A { public: A(int a1) :a(a1) {} int a; }; //多次调用,只定义一次,返回同一个 A ...
  • A.若全局变量单个C文件访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改...如果我们需要一个可重入的函数,那么,我们一定要避免函数中
  • /**********************************************...*函数内部定义局部变量与全局变量重名时,函数在使用该变量的时候会以局部变量覆盖全局变量,也就是只有局部变量会起效果。 ********************************...
  • 静态局部变量

    2014-10-16 10:33:09
    静态局部变量 局部变量前加上“static”关键字,就成了静态局部变量静态局部变量存放内存的全局数据区。函数结束时,静态局部变量...静态局部变量与全局变量共享全局数据区,但静态局部变量在定义它的函数中
  • 关于静态局部变量与静态外部变量

    千次阅读 2017-11-09 19:14:10
    1:静态局部变量存储静态存储区,如果赋有初值,函数调用期间只赋值次,下次调用该函数时,静态局部变量值为上次调用之后的结果,原因:静态局部变量在函数调用期间是不释放的;而自动变量每次调用函数时都会...
  • 用static定义静态局部变量求阶乘

    千次阅读 2012-11-27 16:14:49
    1. /* 2. * Copyright (c) ... 3. * All rights reserved.... 4. * 作 者:吕建 5. * 完成日期:2012 年 11 月27 日 ... 6. * 版 本 号:v1.0 ... 8. * 问题描述:用static定义静态局部变量求阶乘 9. * 程序输出:略
  • 普通全局变量静态全局变量 全局变量... 这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作...
  • 概念首先得明白局部变量,静态局部变量,全局变量,静态全局变量这几个概念,以下面程序举例://main....全局变量:具有全局作用域,全局变量只需在一个源文件中定义,就可以作用于所有的源文件。 静态全局变量:具有全
  • 静态局部变量具有局部作用域,它只被初始化次,自从第次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • 变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量...静态局部变量在定义它的函数内有效,只是程序仅分配次内存, 函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回 后...
  • 3、静态局部变量在定义它的函数内有效,且程序仅分配次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。 4、全局变量和静态变量如果没有手工初始化,则由编译...
  • 静态局部变量和静态全程变量static。

    万次阅读 多人点赞 2019-01-01 13:28:04
    我们知道在函数内部定义变量,当程序执行到它的定义处时,编译器为它栈上分配空间,函数在栈上分配的空间函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中变量的值保存至下一次调用时,如何...
  • static有两种用法:面向...全局变量、局部变量、静态全局变量、静态局部变量的区别  C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,
  • 函数中定义大数组(局部变量)的问题 今天调程序时(我用的是DSP处理器),在函数内部定义了两较大的数组:float a[300],float[300],编译无错也无警告, 但运行时程序会出错,像是跑飞的样子,后来我将这两...
  • 虽然之前编程时对这四个“变量”就有不少困惑,但一直没去细究,前两天联想的笔试题看到了这样一道题,貌似知道它们的区别...静态局部变量在一个函数中定义局部变量时,若加上static声明,则此变量为静态局部变
  • Tables 作用域 存储方式 生命周期 初始化 ... main()函数前(类外)定义,用extern int g_int ;声明,才可以使用 静态全局变量 定义它的文件内 内存的静态存储区域 整个源程序 0 类里声
  • 静态全局变量 作用域仅限于变量被定义的文件,其他文件即使用 extern 声明也没法 使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些 代码行也不能使用它。...静态局部变量 ...
  • 对于有些编译器而言,一个函数内可以定义多个同名的局部变量,比如两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就那个循环体内。 2、如何引用一个已经定义过的全局变量...
  • static关键字c语言主要有两作用。 、修饰变量。变量又分为局部变量和全局变量,但他们都内存的静态区,静态变量只能被初始化次。 静态全局变量,作用域仅...静态局部变量在函数体内定义的,就只能这...
  • 1.C++变量根据定义的位置的不同的...全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 2>静态局部变量具有局部作用域
  • 动态变量:根据你定义的位置确定,比如你在一个函数中定义的,那么超出该函数范围变量将失效 静态变量:程序结束时才释放 3、作用域 动态变量:同样的要根据你定义的位置才能确定,和第二点的一样 静态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 187,681
精华内容 75,072
关键字:

在一个函数中定义的静态局部变量