一、全局变量
定义在函数外的变量,任何函数均可使用,生存期和作用域都是全局
若全局变量无初始化则默认值为0,而函数内的本地变量若无初始化默认值是乱码
若定义的全局变量是指针无初始化则默认值为NULL(0值)
只能用确定的值初始化全局变量,不能用函数返回值等
若在函数内部有变量与全局变量名字相同,在此函数内部将自动隐藏全局变量
#include <stdio.h>
int f(void);//函数声明
int a=12;
int b;//在所有函数之外定义全局变量a
int main()
{
printf("in %s a=%d,b=%d\n",__func__,a,b);
//__func__作用是输出所在的函数名
f();
printf("again in %s a=%d,b=%d\n",__func__,a,b);
return 0;
}
int f()
{
printf("in %s a=%d,b=%d\n",__func__,a,b);
a+=2;
printf("again in %s a=%d,b=%d\n",__func__,a,b);
return a;
}
二、本地变量
本地变量定义在函数内部,进入函数时刻以初始值参与运算,离开函数时刻恢复定义初始值
#include <stdio.h>
int f(void);//函数声明
int a;
int main()
{
f();
f();
f();
return 0;
}
int f()
{
int a=1;
printf("in %s a=%d\n",__func__,a);
a+=2;
printf("运算后 in %s a=%d\n",__func__,a);
return a;
}
三、静态本地变量(static)
静态本地变量定义在函数内部在前面加static ,进入函数时刻以初始值参与运算,离开函数后保持运算后的值,下次进入函数参与运算依旧使用上次运算保留下来的值
#include <stdio.h>
int f(void);//函数声明
int a;
int main()
{
f();
f();
f();
return 0;
}
int f()
{
static int a=1;
printf("in %s a=%d\n",__func__,a);
a+=2;
printf("运算后 in %s a=%d\n",__func__,a);
return a;
}
四、静态本地变量实际为全局变量
静态本地变量实际上是全局变量 ,生存期是全局但是作用域是函数内本地
#include <stdio.h>
int f(void);//函数声明
int a; //全局变量a
int main()
{
f();
return 0;
}
int f()
{
static int b=1;//静态局部变量b
int c=0;//局部变量c
printf("全局变量a的地址 =%p\n",&a);
printf("静态局部变量变量b的地址=%p\n",&b);
//输出地址结果全局变量与静态局部变量是相邻的
printf("局部变量c的地址 =%p\n",&c);
printf("in %s b=%d\n",__func__,b);
b+=2;
printf("运算后 in %s a=%d\n",__func__,b);
return b;
}
五、细节
1、返回本地变量的地址并不安全,最好是返回传入的指针
因为本地变量运算结束后变量的地址会被系统收回进行重新分配 ,因此可能会在此地址存放其他变量
2、返回全局变量或者静态本地变量的地址是安全的
3、返回函数内malloc的内存地址是安全的
(别用,不好用还容易出错)
4、尽量避免使用全局变量 和静态本地变量
尤其不要使用全局变量在多个函数之间传递参数和结果,因为使用静态本地变量和全局变量的函数在多线程并不安全