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

程序执行的作用域

上代码

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 
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)

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

你可能感兴趣的:(作用域及内存的开辟与释放)