全局变量、本地变量、静态本地变量

 一、全局变量

定义在函数外的变量,任何函数均可使用,生存期和作用域都是全局 

若全局变量无初始化则默认值为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、尽量避免使用全局变量 和静态本地变量 

        尤其不要使用全局变量在多个函数之间传递参数和结果,因为使用静态本地变量和全局变量的函数在多线程并不安全 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值