精华内容
下载资源
问答
  • 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(……)                        /*定义外部函数*/
      {……}

    展开全文
  • 在一个函数内部定义的变量(包括函数形参)是局部变量。 全局变量 在函数外定义的变量是局部变量静态变量 静态全局变量 在全局变量...

     

    fishing-panhttps://blog.csdn.net/u013921430转载请注明出处】

    概述

    局部变量

    在一个函数内部定义的变量(包括函数形参)是局部变量。

    全局变量

    在函数外定义的变量是局部变量。

    静态变量

    静态全局变量

    在全局变量前加static修饰。

    静态局部变量

    在局部变量前加static修饰。

    动态对象

    程序在运行过程中动态申请内存的对象(new、malloc)

    内存区

    所存放对象

    创建时期

    销毁时期

    栈内存

    局部非静态对象

    运行到该程序块时分配内存

    离开程序块时销毁

    静态内存

    局部静态对象、类的static成员、所有定义在函数体外的对象

    编译时分配内存

    程序结束时销毁

    堆内存

    动态对象

    运行到该程序块时分配内存

    显式地销毁

     


    局部变量

           在一个函数内部定义的变量(包括函数形参),它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的,这种类型的变量就称为“局部变量”。

           局部变量存储在栈内存,在函数结束后自动销毁。


    全局变量

           在函数体外定义的变量,可以为本源文件中其它函数所公用,有效范围为从定义变量的位置开始到本源文件结束,这种类型的变量就称为“全局变量”。全局变量存储在静态存储区域(静态内存)。

           全局变量可以被同一工程项目中其他文件用extern声明后调用,对其每次进行修改都会被保存。


    静态变量

       静态全局变量

           静态全局变量就是在原先的全局变量前面加上了static进行修饰。静态全局变量依然存储在静态存储区。跟全局变量最大的不同在于,静态全局变量不能被其他源文件使用,只能被本源文件使用,对其每次进行修改都会被保存。

       静态局部变量

           静态局部变量就是在原先的局部变量前面加上了static进行修饰。静态局部变量是静态变量因此存储在静态存储区内,等到整个程序结束才会被销毁。但是它的作用域依然在函数体内部。但是自从静态局部变量被定义后,每次对其进行修改都会被保存下来。


    动态对象

          动态对象是程序运行时分配的对象,例如使用new和malloc分配的对象,这部分对象的生存期由程序来控制,也就是说,动态对象需要我们手动的进行销毁(使用delete和free进行销毁)。动态对象存储在堆区。

     

    示例程序

    #include <iostream>
    using namespace std;
    
    int global = 100;            //全局变量
    
    static int sta_global = 99;   //静态全局变量
    
    int P_fun(int **p)
    {
    	int local = 98;              //局部变量;
    	static int sta_local = 97;   //静态局部变量
    
    	(*p) = new int[10];         //动态对象;
    	for (int i = 0; i < 10;)
    	{
    		(*p)[i++] = i;
    	}
    	sta_global--;
    	global--;
    	cout << "local is" << local << endl;;
    	cout << "sta_local is" << sta_local << endl;
    	cout << "sta_global is" << sta_global << endl;
    	cout << "global is" << global << endl;
    	return sta_local--;
    }
    
    void main()
    {
    	int *Point;
    
    	int times = P_fun(&Point);
    	cout << Point[0] << " " << endl;
    	cout << endl << endl;
    	delete Point;        //释放内存;
    
    	times = P_fun(&Point);
    	cout << Point[0] << " " << endl;
    	cout << endl << endl;
    	delete Point;
    
    	times = P_fun(&Point);
    	cout << Point[0] << " " << endl;
    	cout << endl << endl;
    
    	delete Point;            
    
    	system("pause");
    	return;
    }

     

    程序运行结果

    从上面的结果可以看出,每次调用P_fun( )后,全局变量,静态全局变量,静态局部变量的值都改变。。而局部变量却没有改变,原因就是在退出P_fun( )后,这些变量没有被销毁,而是被保存了下来。局部变量每次都进行了重新定义,每次的值都是一样的。


    已完。。

     

    展开全文
  • 内存的静态存储区域 整个源程序 0 没有全局变量的概念 在main()函数前(类外)定义,用extern int g_int ;声明,才可以使用 静态全局变量 定义它的文件内 内存的静态存储区域 整个源程序 0 类里声
    Tables作用域存储方式生命周期初始化javaC/C++
    全局变量(外部变量)整个工程文件内内存的静态存储区域整个源程序0没有全局变量的概念在main()函数前(类外)定义,用extern int g_int ;声明,才可以使用
    静态全局变量定义它的文件内内存的静态存储区域整个源程序0类里声明为public static的变量main()函数内(类内)定义变量使用static
    局部变量在定义它的函数内内存的栈区函数返回后变量消失不可知在函数内直接定义在函数内直接定义
    静态局部变量在定义它的函数内内存的静态存储区域整个源程序0在函数内使用static定义

    java中一切都是类的一部分。java中的全局变量可以定义一个final类来实现类中的变量可以当作全局变量

    1、static应用范围:可用于内部类、方法和变量。
    2、标记一个方法为static,意味着这个方法,被所在类的所有实例公用,在类装载时被首先执行,执行一次即被所有该类的实例共享,同时意味着:
    A、static方法内部不能引用非static变量。
    B、static方法不能被子类重写为非static方法。
    C、父类的非static方法不能被子类重写为static方法。
    D、static代码块可以用static {}来完成,在类被第一次装载时执行初始化,先于静态方法和其他方法的执行。

    关于java没有静态局部变量的理解:
    很简单的原因是因为sun并没有给java的static赋予c/c++中static那么多的意义。在java中static的意义就只有是在类被加载之后就分配空间(存在)的东西

    使用局部静态变量是很不好的编程习惯,在c/c++编程中也应该尽量避免。这种方法基本上都不是thread safe的,重入也有问题。
    没有什么东西是一定要使用局部静态变量的,一般这种都是为了记录状态,其实只要加个参数就可以解决了。

    我们知道成员方法是在对象创建后才分配空间的,那么如果在成员方法内部定义个static变量,按照java中static的意义就是要这个变量在对象没产生之前就就存在,那么在时间上造成冲突

    展开全文
  • C++ 全局变量、静态全局变量、局部变量静态局部变量的使用,整理表格如下:分类 全局变量 静态全局变量(static) 局部变量(auto) 静态局部变量(static) 作用域 全局作用域(extern) 文件作用域(当前文件) 局部作用域...

    C++ 全局变量、静态全局变量、局部变量、静态局部变量的使用,整理表格如下:

    分类全局变量静态全局变量(static)局部变量(auto)静态局部变量(static)
    作用域全局作用域(extern)文件作用域(当前文件)局部作用域(定义的位置到函数结束)局部作用域(定义的位置到函数结束)
    内存分配全局静态存储区全局静态存储区全局静态存储区
    生存周期程序的整个运行期程序的整个运行期函数生命周期程序的整个运行期
    初值编译时赋值编译时赋值函数调用时候赋值编译时赋值
    展开全文
  • 静态局部变量动态局部变量区别

    千次阅读 2020-05-13 10:03:05
    1.静态局部变量属于静态存储类别,在静态存储区分配存储单元,在整个运行期间都不释放。 而自动变量(动态局部变量)属于动态存储类别,占动态存储空间,函数调用后释放 2.静态局部变量在编译时赋初值,程序运次时已经...
  • 局部变量存储动态数据区; 静态变量存储静态数据区; 全局静态变量存储和局部静态变量都存储静态数据区。   另: 静态函数和普通函数的区别: 静态函数在内存中维持一份,函数只能被当前文件中的函数...
  • 静态变量的类型说明符是static,静态变量属于静态存储方式,但属于静态存储方式的不一定是静态变量,如外部变量(全局变量)就属于静态存储方式,但不是静态变量。必须有static加以定义才是静态变量,或静态全局变量...
  • 动态变量静态变量的区别: 1、存储位置 动态变量存储在内存出栈数据区 静态变量存储在全局数据区(静态数据区) 2、生命期 动态变量:根据你定义的位置确定,比如你在一个函数中定义的,那么...
  • 关于静态局部变量静态外部变量

    千次阅读 2017-11-09 19:14:10
    1:静态局部变量存储在静态存储区,如果赋有初值,函数调用期间只赋值一次,下次调用该函数时,静态局部变量值为上次调用之后的结果,原因:静态局部变量在函数调用期间是不释放的;而自动变量在每次调用函数时都会...
  • 来源:公众号【编程珠玑】作者:守望先生前言这些是编程语言中的基本概念,如果你还不是非常明确地清楚标题的问题,并且不知道作用域,链接属性,存储期等概念的具体含义,那么本文你...
  • 局部变量:在函数内定义的变量,作用域限于函数内。 说明:(1)主函数定义的变量不能再其他函数中使用,主函数也不能使用其他函数定义的变量。 (2)形参变量属于被调函数的局部变量,实参变量属于主调函数的局部...
  • 今天被问到了一个问题:如何让请求的类延迟释放如果要延迟释放或者在程序整个生命周期都存在可以考虑两种方式,一是定义一个静态变量,二是用单例。用单例本质上用的是静态变量。单例的写法如下:+ (instancetype)...
  • 概念首先得明白局部变量静态局部变量,全局变量,静态全局变量这几个概念,以下面程序举例://main.cpp int a = 0; //全局变量 static int b=0;//静态全局变量 main() { int c; //局部变量 static int d;//静态...
  • 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见; D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中
  • 全局变量、局部变量静态全局变量、静态局部变量的区别 C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。 从作用域...
  •  按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态 存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的 文件内有效;静态局部...
  • 1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • 自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,所以允许我们在这个函数...
  • 变量可以分为全局变量、静态全局变量、静态局部变量局部变量存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分:全局变量在整个工程文件内都...
  • 形参、局部变量静态局部变量的差别  从本质上说,三者均属于局部作用域中的变量,其中局部变量又可以分为普通(非静态局部变量静态局部变量。它们的差别: 作用域:形参的作用域为整个函数体;而普通(非...
  • C语言的动态存储变量与静态存储变量     动态存储变量与静态...二是“作用域”,如上节所述,由变量所处的位置确定变量是局部变量还是全局变量,从而确定变量的作用域;三是“存储类别”,即变量在内存中的存
  • 全局变量局部变量静态全局变量、静态局部变量的区别   转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html 标签:全局变量 局部变量 静态全局变量 静态局部变量 ...
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • 存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1、全局变量在整个工程文件内都有效; 2、静态全局变量只在定义它的文件内有效; 3、...
  • 本文转自百度百科 静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量... 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。 由此看来,一
  • C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。  从作用域看 ... 静态局部变量具有
  • 静态局部变量

    2014-10-17 01:52:01
    而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。 (2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。...
  • 常见的存储区域可分为: ...里面的变量通常是局部变量、函数参数等。 2、堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 190,194
精华内容 76,077
关键字:

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