精华内容
下载资源
问答
  • 局部变量生存期

    2009-11-18 16:21:00
    for(int i = 0;i{ int b; { //此花括号很重要,它改变量局部变量a的生存期,将其生存期限制在此花括号范围内。 int a; }}

    for(int i = 0;i<8;++i)

    {

        int b;

        {               //此花括号很重要,它改变量局部变量a的生存期,将其生存期限制在此花括号范围内。

             int a;

        }

    }

    展开全文
  • 关于c++中局部变量生存期的思考

    千次阅读 2010-04-14 15:54:00
    我想在c++中局部变量的的生存期大家都很熟悉了吧,就生存在最近的一对大括号里,出了该括号,该变量就自动销毁了。因为我们经常在阻塞模式下写代码,所以没什么问题,但是换到非阻塞下呢,比如说多线程。下面看段...

          我想在c++中局部变量的的生存期大家都很熟悉了吧,就生存在最近的一对大括号里,出了该括号,该变量就自动销毁了。因为我们经常在阻塞模式下写代码,所以没什么问题,但是换到非阻塞下呢,比如说多线程。下面看段代码:

    #include<iostream>
    #include"windows.h"
    using namespace std;
    CRITICAL_SECTION cs;
    class info{
    public:
    // info(){};
    // ~info(){cout<<"sx"<<endl;};
     int a;
    };
    DWORD WINAPI f(LPVOID l){
     info *in=(info*)l;
     EnterCriticalSection(&cs);
     cout<<in->a;
     LeaveCriticalSection(&cs);
     return 0;
    }
    HANDLE h[5];
    main(){
     InitializeCriticalSection(&cs);
     for(int i=0;i<5;i++){
      info a;
      a.a=i;
      h[i]=CreateThread(0,0,f,(void*)&a,0,0);
     }
    WaitForMultipleObjects(5,h,true,-1);
    DeleteCriticalSection(&cs);
    }

    看看结果,蛮诧异的吧,和预期的不一样,而且还有重复的。怎么会这样呢?在vc里调试了下发现了结果,在那个for循环里对象a在出了当前循环便自动销毁了,下次循环中新建的a对象的地址实际上就是前面一个a的地址,两个地址重复了,而且线程传递中传的也是a的地址,所以在多线程中调用的a对象的地址都是同一个地址,所以会出现重复的结果。好,下面我们来改下代码:

    #include<iostream>
    #include"windows.h"
    using namespace std;
    CRITICAL_SECTION cs;
    class info{
    public:
    // info(){};
    // ~info(){cout<<"sx"<<endl;};
     int a;
    };
    DWORD WINAPI f(LPVOID l){
     info *in=(info*)l;
     EnterCriticalSection(&cs);
     cout<<in->a;
     LeaveCriticalSection(&cs);
     return 0;
    }
    HANDLE h[5];
    main(){
     info a[5];
     InitializeCriticalSection(&cs);
     for(int i=0;i<5;i++){
     
      a[i].a=i;
      h[i]=CreateThread(0,0,f,(void*)&a[i],0,0);
     }
    WaitForMultipleObjects(5,h,true,-1);
    DeleteCriticalSection(&cs);
    }

    是不是结果正确了啊,在这里我们把a定义了一个对象数组,并且位置放到了for循环外,所以在main函数内该对象都不会销毁。当然我们也可以在for循环内new一个对象,那么这个对象就在堆中,生存期由编写者决定,记得要释放。

           本文由不足之处,还望大家多多指正。

    展开全文
  • 编程入门基础 局部变量生存期 主讲教师 耿宇航 Copyright2013, All Rights Reserved 局部变量 局部变量也叫做 自动变量 栈变量 它是如何分配如何释放的 Copyright2013,, All Rights Reserved 三种情况 函数大括号 ...
  • )首先,一旦你离开这个范围,局部变量就会被销毁。例如,在函数中,当返回时,将丢失对定义为some_dict的变量的所有引用。因为您返回的是a,如果您没有a_var = some_function()这样的东西,其中a引用将被a_var...

    When is the dictionary some_dict destroyed/de-allocated? (when the

    function returns?)

    首先,一旦你离开这个范围,局部变量就会被销毁。

    例如,在函数中,当返回时,将丢失对定义为some_dict的变量的所有引用。因为您返回的是a,如果您没有a_var = some_function()这样的东西,其中a引用将被a_var捕获,那么您也将丢失a。When is the dictionary some_dict created in the memory? (first time

    the function is called?)

    对于每个方法调用,这里都有一些{'random':'values'}。Should I worry about such things when learning/dealing with python?

    是的,请检查下面的示例>>> dictionary = {1: 1, 2: 2}

    >>> function()

    >>> def function():

    dictionary = {1: 2, 2:1}

    print dictionary

    >>> function()

    {1: 2, 2: 1}

    >>> dictionary

    {1: 1, 2: 2}

    在这里,您可能假设您正在重新分配字典,但是python正在创建一个本地字典,在您从函数返回后很快就会丢失how to over come the above issue, use global it would tell that you are trying to reference object define outside the function.>>> def function():

    global dictionary

    dictionary = {1: 2, 2:1}

    print dictionary

    >>> function()

    {1: 2, 2: 1}

    >>> dictionary

    {1: 2, 2: 1}Where do I learn about such details of a language? I tried looking in

    the docs but couldn't find what I was looking for.

    可能问题应该是how do I learn such details,简单易用,理解文档并重新阅读。

    展开全文
  • C语言 局部变量与全局变量的生存期

    千次阅读 2019-08-01 19:56:29
    1.局部变量 仅仅在定义它的函数的内才能有效使用,其作用域仅限在函数体内,即从变量定义的位置开始,到函数体结束。 2.局部变量的内存分配: 通常,编译器不为局部变量分配内存单元,而是在程序运行中,当局部...

    定义与声明的区别:把建立存储空间的变量声明称定义,而把不需要建立存储空间的声明称为声明

    静态局部变量,只有定义,没有声明。如果定义时没有赋值,默认其值为0
    

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190801195327885.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIwMjYzNQ==,size_16,color_FFFFFF,t_701在这里插入图片描述

    1.局部变量
    仅仅在定义它的函数的内才能有效使用,其作用域仅限在函数体内,即从变量定义的位置开始,到函数体结束。

    2.局部变量的内存分配:
    通常,编译器不为局部变量分配内存单元,而是在程序运行中,当局部变量所在的函数被调用时,系统根据需要临时为其分配内存。当函数执行结束时,局部变量被撤销,占用内存被收回。

    注意:
    局部变量在函数被调用时由系统分配存储区,在不同的声明周期的函数中同名的变量实际上在内存中占不同的单元,因此在不同的函数中可以定义相同名字的局部变量。生命周期相同的函数的同名局部变量,占用不同的内存单元。

    总结:这种内存分配方式叫自动分配内存,对于自动分配(栈分配),变量与其所在的代码块共存亡。

    补充:
    对于静态分配编译器预分配),变量与程序共存亡,程序开始执行时即已存在,一致到程序运行完毕退出后才撤销。

    静态分配,生命周期就是整个程序执行周期,内存会一直存在,main函数执行之前就创建,无论函数如何运行,如何调用,内存一直不会被回收,一直到程序结束才被系统回收。


    动态分配的生存期,从malloc开始,free结束。

    动态分配和静态分配的区别

    静态分配一般在栈上,系统自己分配和回收内存。动态分配在堆上,由程序员自己决定分配和回收内存。


    跨文件使用:结合extern关键字,调用其他文件中的变量。
    static声明的变量只能在本文件中使用。


    3.全局变量
    在函数外定义的变量称为全局变量,也称外部变量,全局变量的作用域较广,全局变量不属于任何一个函数,理论上可被其作用域中的所有函数访问,因此,提供了一个不同函数间联系的途径,使函数间的数据联系不只局限于参数传递和return语句。

    全局变量的作用域就是从其定义处到源文件结束,调用全局变量不能超出其作用域。

    全局变量一经定义,编译器会为其分配固定的内存单元,在程序运行期间,这块内存单元始终有效,一直到程序执行完毕才由操作系统收回该块内存

    全局变量:extern变量又称全局变量,放在静态存储区,所谓全局,是说该变量可以在程序的任意位置使用,其作用域是整个程序代码范围内,可以被程序其他函数所引用,不仅仅局限在本文件。


    5. 全局变量的声明与定义在函数外部:
    Int num 就会被解析为extern int num;
    Int num = 10就会被解析为 extern int num =10;

    6. 全局变量定义的基本格式为:
    extern 类型 变量名 = 初始化表达式 ;
    此指令通知编译器在静态存储区中开辟一块指定类型大小的内存区域,用于存储该变量
    例如:创建了一个初始值为100的int型全局变量m:
    extern int m=100;

    7.C语言规定,只要是在外部,即不是在任何一个函数内定义的变量,编译器就将其当作全局变量,无论变量定义前是否有extern说明符

    8.全局变量仅有声明,没有赋值,调用时会报错

    extern作用域是本程序的所有源代码文件,只要在一个文件中定义,在其他文件中使用时只要对其进行声明即可。
    静态全局变量其作用域仅限于从定义位置起到本文件结束的一段代码区域,不能被其他文件中的函数所使用。


    展开全文
  • 代码来自学堂在线的清华大学的一门C++课程 课程链接:C++语言程序设计基础 //5_2.cpp #include <iostream> using namespace std;... //c为局部变量,具有动态生存期,每次进入函数时都初始化 int c =
  • 全局变量 也称外部变量,在函数体外定义。 全局变量分为外部全局变量和静态全局变量。区别:使用static存储类别的全局变量只能在被定义的源程序文件中使用,而使用extern... 所谓的生存期,是指变量占用内存或者寄...
  • 使用static声明的局部变量生存期

    千次阅读 2016-03-24 16:19:19
    static声明的局部变量,在程序执行前就产生,存放在内存的静态存储区,只能被赋值一次,生命周期为整个程序,而不是从声明处开始。 它与全局变量的区别在于可见性:全局变量为文件作用域,而static局部变量只在定义...
  • 解析:主要考察局部变量和全局变量的生存期,以及静态本地变量。注释后的代码如下: int x, y, z, w; //这里是全局变量,定义在任何函数的外面,若不初始化赋值,则均为0;。注意,主函数里面的变量仍为局部变量...
  • 变量的存储方式和生存期 在C语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。对数据类型,读者已经熟知(如整形、浮点型等)。存储类别指的是数据在内存中存储方式(如静态存储和动态存储)。 ...
  • 动态存储方式与静态存储方式 从变量的作用域(即从空间)的角度来观察,变量可以分为全局变量和局部变量。从变量值存在的时间(即生存期)来观察,有的变量在程序运行的整个过程都是存在的,而有的变量则是在调用其所在的...
  • 这里讲静态局部变量c的生存期从它所在的函数开始,书上讲“如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期,获称该变量在此时刻“存在”“,似乎是说这个静态局部变量从它所在的函数开始才...
  • 变量生存期

    2018-06-27 21:25:49
    函数体内的局部变量在函数执行结束后就会被自动释放。只在函数体内有用。
  • 生存期: 全局变量: 生存期和程序一致; 作用域为从声明处至程序结束; 动态局部变量: ...(是指语句块内声明的变量,包括函数形参) ...(指编译器为变量分配内存的方式,...作用域同动态局部变量生存期为整个程...
  • //局部变量和全局变量 定义变量可能有3种情况: 1.在函数的开头定义 2.在函数内的复合语句内定义 3.在函数的外部定义 在函数内定义的变量是局部变量,在函数之外定义的变量是全局变量 为了便于区别全局变量和局部变量...
  • 变量的作用域:(决定了变量的有效范围...局部变量:函数内部定义的变量,作用域和生存期在函数内;main函数中定义的变量也只是在其函数内;  形参变量属于被调函数的局部变量,实参属于主调函数的局部变量;  ...
  • #include <stdio.h> const int A = 10; int a = 20; static int b = 30; int c; int main(void) { static int a = 40;...作用域(Scope)这个概念适用于所有标识符,而不仅仅是变量,C语言的作用域.
  • 正确 错误 解析: 局部变量存在栈区 new出的变量存在堆区 static变量和全局变量由操作系统释放
  • C++ 变量生存期变量生存期是指其在程序运行时占用内存空间的时间段。1. 静态生存期 从程序开始执行时分配到程序结束时收回。 如:全局变量2. 自动生存期 从程序执行到定义它们的复合语句时分配到复合语句执行...
  • 局部变量 指再函数体定义的变量和函数的形参。函数内部定义的变量和函数的形参只能在本函数内部使用,函数之外不能使用。 全局变量 在函数体外部定义的变量称为全局变量。全局变量从定义开始可以供本源程序文件中...
  • 文章目录递归问题集数组作为函数参数一维数组多维数组局部变量和全局变量局部变量全局变量变量的存储方式和生存期动态存储方式与静态存储方式局部变量的存储类别自动变量auto静态局部变量static寄存器变量register...
  • c/c++ 变量生存期

    2013-11-14 00:38:47
    static 及全局变量,存放在静态存储区,生存期全局   局部变量,定义在栈端中,生存期在于所在函数或者类的生存期  利用malloc或new的变量,定义在堆上,生存期知道free或delete
  • 变量生存期

    2017-04-17 16:08:33
    1.变量的生存期。  首先变量分为全局变量以及局部变量。 ①全局变量是在主程序中进行定义,有效范围从定义...②局部变量是在程序的函数中定义,有效范围只在函数内部,当函数结束后,局部变量生存期也就结束了。
  • 标题:全局,局部,静态变量和变量的作用域,生存期; 内容:A.观看MOOC10.2,10.3; B(a).局部变量:定义在函数内部的变量(包括函数的形参),全局变量:定义在函数外面的变量 全局变量在所有函数中均可使用,...
  • JavaScript 变量的生存期 JavaScript 变量的生命期从它们被声明的时间开始。 局部变量会在函数运行以后被删除。 全局变量会在页面关闭后被删除。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,057
精华内容 422
关键字:

局部变量生存期