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

2018-09-03  本文已影响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循环比较典型,所以我们以此举例

分析之前我们要明确几个概念

废话不多说,上图


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)

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)

未完待续......

上一篇下一篇

猜你喜欢

热点阅读