程序执行的作用域
上代码
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)
- 堆内存可以存放任意类型的数据,但需要自己申请和释放
- 堆内存,想象中无限大,但实际使用中,受限于内存的大小和内存是否具有连续性