目录
内存分布
代码区(函数) |
全局(静态)变量区(定义在函数之外的,或加有static的变量)(数据段) |
栈(普通定义的变量) |
堆(动态内存分配malloc) |
生命周期 | 作用域 | 默认值 | 内存区域 | 链接属性 | |
普通局部变量 | 从函数创建开始到函数结束 | 函数内 | 随机值 | 栈 | 无 |
静态局部变量 | 从函数创建开始到进程结束 | 函数内 | 随机值 | 全局(静态)变量区 | 无 |
普通全局变量 | 从进程创建开始到进程结束 | 文件内 | 0 | 全局(静态)变量区 | 外部 |
静态全局变量 | 从进程创建开始到进程结束 | 文件内 | 0 | 全局(静态)变量区 | 内部 |
动态内存 | 只要有开辟的内存空间的首地址,就可以访问 | 随机值 | 无 |
总结:
①static+局部变量:改变生命周期
static+全局变量:改变链接属性(由外部改成内部)
static+函数:改变链接属性(由外部改成内部)
②全局变量的生命周期是整个程序
③局部变量没有链接属性。
代码显示:
#include<stdio.h>
int a;//全局变量,程序开始到程序结束,整个文件,0,外部
static int b;//静态全局变量,程序开始到程序结束,整个文件,0,内部
const int c=0;//静态,c的值不可改变,作用域是整个文件,常变量,内部
int main()
{
int d;//局部变量,函数开始到函数结束,随机值
static int e;//静态局部变量,函数开始到程序结束,作用域是函数内
const int f = 20;//c的值不可改变,作用域是整个函数,常变量
for (int i = 0; i < 10; i++)//作用域只在for循环中
{
printf("%d\n", a++);
}
}
解释:
链接属性分为外部和内部,如果是内部链接属性,则相当于我不允许被人从外部访问到。
如果是外部链接属性,则相当于别人可以从外部访问到。
Debug:伪随机(堆:0xcdcd,栈0xcccc)
用户版本下:随机值
问题:
1.static与const的区别
①类型说明符和类型限定符。
② static修饰的内容可修改,const修饰的内容不可修改。
2.#include<>与#include“”的区别
①头文件里存放的主要是函数与变量的定义和声明,说明有这个函数。
系统提供的用<>,去默认的路径去找,自己写的用“”,先去默认路径去找,找不到时再在项目里找。