美文网首页
作用域及内存的开辟与释放

作用域及内存的开辟与释放

作者: Cc_5691 | 来源:发表于2018-09-16 16:17 被阅读0次

    程序执行的作用域

    上代码

    int main()
    {
        int a =1;
        for(int i = 0;i <3;i++){
            int b = 2;
            printf("%i\n",i);
        }
        return 0;
    }
    

    -这是一个简单的main 函数,里面嵌套了一个for循环,其中a在main函数之内,for循环之外定义,i在for循环()中定义,b在{ }中定义。
    for循环比较典型,所以我们以此举例

    分析之前我们要明确几个概念
    • { }在C语言中是块级作用域的标志,被一对{ }包起来的语句在同一个作用域下
    • for、while、do-while会有两层作用域,如实例中()中变量 i 与 { }的作用域处于同级
    • 注意点:
      • 内层作用域可以访问外层作用域,反之不行
    int main()
    {
        int a =1;
        for(int i = 0;i <3;i++){
            int b = 2;
            printf("%i,%i\n",i,a);
        }
        return 0;
    }
    

    可以访问外层作用域a,如图


    =
    • 反例1(会报错)
    #include <stdio.h>
    int main()
    {
        int a =1;
        printf("%i",b);
        for(int i = 0;i <3;i++){
            int b = 2;
            printf("%i,%i\n",i,a);
        }
        return 0;
    }
    
    • 反例二
      • 会报错,敲重点!'b' undeclared,()中的变量和{ }中的变量不同级,()中变量在外层,无法访问内层中{ }变量
    int main()
    {
        int a =1;
        for(int i = 0;i <3;i++,b++){
            int b = 2;
            printf("%i,%i\n",i,a);
        }
        return 0;
    }
    

    内存管理

    • 进程空间图示
      • 程序被加载到内存以后内存空间的布局

    栈内存(stack)

    • 栈中存放任意类型的变量,但必须是auto类型修饰,即自动类型的局部变量,随用随开,用完即销
    • 内存的分配与销毁由系统自动完成,不需要人工干预
    • 栈的最大尺寸固定,超出则引起栈溢出
    • 局部变量过多、过大或递归层数太多就会引起栈溢出

    int ages[10240*10240]; // 程序会崩溃, 栈溢出

    int main()
    {
        // 存储在栈中, 内存地址从大到小
        int a = 10;
        int b = 20;
        printf("&a = %p\n", &a); // &a = 0060FEAC
        printf("&b = %p\n", &b); // &b = 0060FEA8
        return 0;
    }
    

    堆内存(heap)

    • 堆内存可以存放任意类型的数据,但需要自己申请和释放
    • 堆内存,想象中无限大,但实际使用中,受限于内存的大小和内存是否具有连续性

    相关文章

      网友评论

          本文标题:作用域及内存的开辟与释放

          本文链接:https://www.haomeiwen.com/subject/bahfnftx.html