静态变量和自动变量的区别
声明区别
- 定义局部变量的时候没有加static 是自动变量(一般数据类型加上变量名的方式定义变量等到的就是自动变量)
- 定义局部变量的时候加了static是静态变量 局部静态变量的初始化语句在第一次执行的时候执行一次,以后再也不执行
存储区别
- 局部变量是在静态存储区内分配内存单元,在整个程序运行期间都不释放 局部变量的生命周期跟随程序的生命周期
- 自动变量(一遍形式声明的变量)是存储在动态存储区域(栈) 在函数执行完成后销毁
其他区别
- 静态局部变量在编译时完成赋予初值,并且只赋一次值,以后函数再次被调用的时候只是用上次函数被调用结束时变量的值,而自动变量的初值不是在编译期赋值的,是在函数被调用的时候赋值的,每一次函数都会对变量进行重新赋值
- 静态变量如果没有赋初始值的话,静态变量的初始值为0或者为空字符串,自动变量来说他的初始值是不确定的值,因为函数被调用是会为变量分配一个内存空间,在函数结束的时候,存储空间被释放,两次分配的存储空间是不一样的,存储空间的值也是不确定的。
全局变量和局部变量
- 全局变量在函数体外定义的变量
- 局部变量在函数体内定义的变量
编译器采用就近原则,当有两个变量的名称相同时(一个全局变量一个局部变量)取最接近的变量进行处理。即当全局变量与局部变量冲突时,全局变量服从局部变量;
全局变量的作用域
全局变量的作用域是从变量定义开始到文件结束(不考虑被外部文件引用的情况下)
可以使用extern关键字来扩大全局变量的作用范围
extern被用将全局变量的作用范围扩大到另一个文件中去
// onefile.c
# include <stdio.h>
void f (void);
int main(void) {
extern int number;
printf("%d\n", number);
return 0;
}
// twofile.c
int number = 0;
void f(void) {
return;
}
总结
- 提倡定义全局常量 避免定义全局变量
- 编译器采用就近原则
- 自动变量的初始值为不确定的值
- 要调用其他文件中的全局变量使用extern声明下
- 要防止其他文件调用本文件的全局变量要在本文件的全局变量的声明的数据类型之前加上static关键字