全局变量、本地变量、静态本地变量
-
全局变量的初始化发生在main函数之前,没有初始化的全局变量会得到0值,指针会得到NULL。
-
局部变量没有初始化,会出现一个乱七八糟的值。内存中有什么就得到了什么结果。全局变量初始化时只能被赋值为一个编译器已知的值,一般是一个常数
-
如果指针p,和a都是在main函数中定义的,在test函数中不能直接调用,main也是个函数只不过是第一个执行的函数,mian里面定义的变量也是局部变量
-
有选择的情况下不用全局变量,全局指针,特别是在一个大型的程序里,因为全局的东西大家都可以修改他,你不知道哪个函数就给他调用了修改了,就会导致程序出错,指针还有可能在别的地方将内存释放掉。
-
如果有与局部变量的名字一样的话,全部变量会被隐藏而不是被覆盖
//
int quanju = 12;
int quanju2 = quanju1; //报错
//
int quanju=12;
void main(){
f(); //这里局部变量覆盖全局,输出1
printf("%d",quanju); //这里全局回来了,输出12
}
void f (void ){
int quanju = 1;
printf("%d",quanju);
}
- 静态本地变量
在本地变量前加入 static 修饰,当函数离开时,他会继续存在并保存其值。静态本地变量的初始化只会在第一次进入函数的时候做,以后进入函数保持上次离开的值。
静态本地变量实际上是全局变量,他的生存期是全局,内存空间是全局,作用域只在函数内部。
int quanju=1;
int main()
{
f();
return 0;
}
int f(void )
{
int k=0;
static int a=1;
printf("&quanju=%p\n",&quanju);
printf("&a=%p\n",&a);
printf("&k=%p\n",&k);
}
//从这个和实验可以看出静态本地变量和全局变量存放在相邻的内存空间中
一个返回本地变量地址的指针是危险的。因为本地变量的内存出了函数以后就被释放掉了,这个内存就会被别的变量使用。
返回全局变量或者是静态本地变量是安全的,?但是使用这两个的函数是线程不安全的