精华内容
下载资源
问答
  • 不要使用局部变量的指针引用! 在函数结束后,局部变量被释放后,指针引用可能在短时间内可以使用,也可能会立即失效。因为在指针引用所指向代表的 内存一旦被重新分配就会导致该指针引用会立即失去原本...

    局部变量,参数变量存放在栈中,当离开作用范围后,分配的内存在作用范围外会被系统自动回收。

    切记!不要使用局部变量的指针和引用!

    在函数结束后,局部变量被释放后,指针和引用可能在短时间内可以使用,也可能会立即失效。因为在指针和引用所指向和代表的

    内存一旦被重新分配就会导致该指针和引用会立即失去原本想要存储的值,出现严重的语义错误。

     

    要想确保返回的引用或者指针是正确的,不妨提问:引用所引的对象或指针所指的对象是在函数之前已经存在的哪个对象?

     

    new出来的内存空间存放在堆中,不受作用域管理,不会被系统自动回收,只有在使用delete删除或者整个程序结束后才会释放内存。

    因此很容易发生忘记delete而造成内存泄漏事件。例如在某个函数中定义有:

    A* a=new A();

    则指针a在函数运行完毕后将销毁,但是new出来的内存并不会被销毁,需要执行delete a;才能被销毁。

    此外static变量,全局变量的有效期都是整个程序运行期。

    而智能指针的出现则是在指针被销毁的情况下,也会销毁指针指向的内存,避免内存泄漏发生。

    这是一种常见的内存泄露的情况。尽量避免手动管理指针,采用c++11中的shared_ptr和unique_ptr来管理。


    但是有一种情况可以使用局部变量的引用,就是可以在f函数中调用g函数的时候,使用局部变量b作为函数f中调用g函数的引用形

    参b。

    因为这里与函数的递归类似,在A函数没有结束之前,它的调用栈还没用被释放就在其中又调用了一个B函数,并且在这个B函数

    中使用了A函数中的临时变量的引用,这样就不会出现在使用这个引用的时候,出现混乱的现象,是可以的。
     

    int f(int &a){
    
        int b=a-1;
    
        g(b);
    
    }
    int g(int &b){
    
        cout<<b;
    
    }

    同时,若在函数A中直接对B函数调用,并且B这个函数的形参使用该临时变量的一个计算值即一个右值传递给这个形参,需要使

    这个形参设置为const。因为右值即将销毁,表达式求值过程中创建的临时变量。即以下情形。

    int f(int &a){
    
        g(b-1);
    
    }
    int g(const int &b){
    
        cout<<b;
    
    }

    定义全局变量

    使用全局变量
    先在定义全局变量的.h文件中使用extern int g_i;定义全局变量
    再在要使用全局变量的.cpp文件中包含该.h文件,对该全局变量定义一下,在最外层定义int g_i;
    其他cpp若要使用该全局变量,只需要也包含该.h文件。
    需要注意的是只能定义一次,第一次在最外层定义了全局变量后不能再定义。

    展开全文
  • C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register) 1----局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量...

    C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)

    1----局部变量和全局变量
    在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。

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

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

    1.2 全局变量
    全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。

    2. 变量的存储类别
    2.1 动态存储方式与静态动态存储方式
    前面已经介绍了,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。
    从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。

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

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

    1. 程序区;
    2. 静态存储区;
    3. 动态存储区;

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

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

    1. 函数形式参数;
    2. 自动变量(未加static声明的局部变量);
    3. 函数调用实的现场保护和返回地址;

    对以上这些数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。
    在c语言中,每个变量和函数有两个属性:数据类型和数据的存储类别。

    2.2 auto变量
    函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。

    a是形参,b,c是自动变量,对c赋初值3。执行完f函数后,自动释放a,b,c所占的存储单元。
    关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。

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

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

    2.4 register变量
    为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。

    说明:

    1. 只有局部自动变量和形式参数可以作为寄存器变量;
    2. 一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;
    3. 局部静态变量不能定义为寄存器变量。

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

    说明:在本程序文件的最后1行定义了外部变量A,B,但由于外部变量定义的位置在函数main之后,因此本来在main函数中不能引用外部变量A,B。现在我们在main函数中用extern对A和B进行“外部变量声明”,就可以从“声明”处起,合法地使用该外部变量A和B。

    展开全文
  • here 1Java中对象的存储位置 String aa = new String();...4.Java中全局变量和Static常量的存储位置 存放在全局数据区内存中 5.java中static修饰的成员变量及参数存放位置 存放在代码段内存中 ...

    Java把内存划分为以下bai4个部分:
    1、栈区(stacksegment)—由编译器自动du分配释放,存放函数的参数zhi值,局部变量的值等,具体方法dao执行结束之后,系统自动释放JVM内存资源。
    2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收。
    3、静态区(datasegment)—存放全局变量,静态变量和字符串常量,不释放。
    4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域。

    here
    1Java中对象的存储位置
    String aa = new String();
    new创建的对象存储在堆内存中;
    aa这个局部变量存储在栈内存中;
    2.Java中常量的存储位置
    常量存放在常量池中,而常量池在堆内存中
    3.Java中局部变量的存储位置
    局部变量存放在栈内存中
    4.Java中全局变量和Static常量的存储位置
    存放在全局数据区内存中
    5.java中static修饰的成员变量及参数存放位置
    存放在代码段内存中

    展开全文
  • 静态存储方式:是指在程序运行期间分配固定的存储空间的方式。 动态存储方式:是在程序运行...全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固
     静态存储方式:是指在程序运行期间分配固定的存储空间的方式。

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

     

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

    1)       程序区;

    2)       静态存储区;

    3)       动态存储区;

     

     

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

     

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

    1)       函数形式参数;

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

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

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

    展开全文
  • 全局变量和局部变量存储位置

    千次阅读 2015-09-26 17:25:52
    全局变量和局部变量在内存中的区别是什么? 正确答案: B C 你的答案: C (错误)...内存中,全局变量和静态变量存在于全局区/静态区,局部变量存在于栈区,new的对象存在于堆区,malloc的对象存在于自由存储区,常量存
  • 局部变量和全局变量

    2016-03-27 19:21:03
    在函数内的变量——局部变量,在函数外的变量——全局变量(外部变量)和全局变量和局部变量相关的有一个词叫做“变量的作用域”。变量的作用域:变量起作用的范围,可以用药效来类比。 C语言中变量和函数都有两个...
  • 局部变量和全局变量 局部变量即内部变量: 1.只在本函数内有效 2.主函数中定义变量只在主函数中有效,而不是在整个文件内有效。 主函数也不能使用其他函数定义的变量。 3.形式参数也是局部变量。 4.复合语句(比如有...
  • 但还有一个小点就是存放在静态数据区的变量是由低地址向高地址存放的,但存放在栈区的变量却是由高地址向低地址存放的,存放在静态数据区的还有静态局部变量和静态全局变量。 #include <iostream> using ...
  • C语言中局部变量和全局变量在内存中的存放位置

    千次阅读 多人点赞 2012-12-12 10:16:41
    C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)   1.局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参...
  • C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在...
  • 局部变量和全局变量,以及作用范围

    万次阅读 多人点赞 2018-11-11 13:56:55
    变量按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 变量按作用域分:  全局变量:在整个工程文件内都有效;“在函数外定义的变量”,即从定义变量...
  • 一、从变量作用域角度划分,变量可分为局部变量和全局变量。 1、局部变量是定义与函数内的变量,作用域是其定义时所在大括号范围内,出了作用域其占用的内存单元就会被释放掉。 2、全局变量是定义于函数外的变量,...
  • 想问一下,修改下面代码中的全局变量后,在打印pstr变量时,为什么在反汇编代码中看到callq 5e0 (栈检查失败),这是pstr的地址指向出现了问题吗,求大佬详细地解答 ``` #include #include #include ...
  • 变量的作用域?...原因是所有定义的变量都是先在内存中开辟该变量的存储位置,即变量存储在栈中,当代码解释到该语句时才会将值存在栈中,即值先不做处理,所以调用一个变量时计算机是先去栈中查找有没有该...
  • 1.static的作用 (1) 修饰局部变量时,只初始化一次,延长了局部变量生命周期...2.staic全局变量和局部变量的区别,存储位置? 区别: 静态全局变量: (1)静态变量包况后面的静态局部变量,都在全局数据区分配内存。
  • 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在...
  • 变量进阶(理解)目标变量的引用可变和不可变类型局部变量和全局变量01. 变量的引用变量 和 数据 都是保存在内存中的在Python中函数 的 参数传递以及返回值都是靠引用传递的1.1 引用的概念在Python中变量和数据是分开...
  • 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在内存中的 在Python中函数 的 参数传递以及返回值都是靠引用传递的 1.1 引用的概念 在Python中 变量和数据是分开存储的 数据保存在...
  • C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register) 1----局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量...
  • 局部变量全局变量

    2018-01-29 10:48:02
    变量的作用域是指变量有效性的范围,与变量定义的位置密切相关,作用域是从空间这个角度来描述变量的,按照作用域的不同,变量可分为局部变量和全局变量。 1、局部变量 在函数(或代码块)内部定义的变量,也称为...
  • 变量进阶(理解)目标变量的引用可变和不可变类型局部变量和全局变量01. 变量的引用变量 和 数据 都是保存在内存中的在Python中函数 的 参数传递以及返回值都是靠引用传递的1.1 引用的概念在Python中变量和数据是分开...
  • 系统存储位置 使用范围 注意 静态变量 (Static Variable) 程序执行之前系统就为之静态分配(也就是运行时不再改变分配情况 ) 以staic存储类声明的变量 没有赋初值存放在.bss段,有赋初值存放在.data段 函数...
  • Java中成员变量、局部变量全局变量、静态变量存在位置及初始化 因为线程是共享进程的资源的,所以栈是私有的,堆是公有的。 (1)程序内存布局场景下,堆与栈表示两种内存管理方式; (2)数据结构场景下,堆与栈...
  • 全局变量,分配的内存在静态存储区内存上面,其作用域是全局作用域,也就是整个程序的生命周期内都可以使用,同时,有些程序并不是由一个源文件构成的,可能有许多个源文件构成,全局变量只要在一个文件中定义,就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 544
精华内容 217
关键字:

局部变量和全局变量存储位置