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

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

作者: 箩篼 | 来源:发表于2018-09-03 11:19 被阅读0次

    程序执行的作用域

    上代码

    #include <stdio.h>
    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 与 { }的作用域处于同级

    废话不多说,上图


    for作用域.png

    哈哈,懂了吧~~~

    注意点:

    • 内层作用域可以访问外层作用域,反之不行
    #include <stdio.h>
    int main()
    {
        int a =1;
        for(int i = 0;i <3;i++){
            int b = 2;
            printf("%i,%i\n",i,a);
        }
        return 0;
    }
    

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


    xxx.png

    反例一

    #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;
    }
    

    会报错

    反例二

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

    会报错,敲重点!'b' undeclared,()中的变量和{ }中的变量不同级,()中变量在外层,无法访问内层中{ }变量


    内存管理

    咳咳,敲重点

    进程空间图示

    程序被加载到内存以后内存空间的布局


    栈内存(stack)

    • 栈中存放任意类型的变量,但必须是auto类型修饰,即自动类型的局部变量,随用随开,用完即销
    • 内存的分配与销毁由系统自动完成,不需要人工干预
    • 栈的最大尺寸固定,超出则引起栈溢出
      • 局部变量过多、过大或递归层数太多就会引起栈溢出
    int ages[10240*10240]; // 程序会崩溃, 栈溢出
    
    #include <stdio.h>
    
    int main()
    {
        // 存储在栈中, 内存地址从大到小
        int a = 10;
        int b = 20;
        printf("&a = %p\n", &a); // &a = 0060FEAC
        printf("&b = %p\n", &b); // &b = 0060FEA8
        return 0;
    }
    
    作者:极客江南
    链接:https://www.jianshu.com/p/3bcd5f625fef
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
    

    堆内存(heap)

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

    未完待续......

    相关文章

      网友评论

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

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