通过学习,我对全局变量以及静态本地变量有个简单基础的认识。以下是我的学习笔记,与大家分享,如果有不妥的地方,欢迎大家在评论区指出来,一起学习进步!!!
创新互联建站专注于企业成都全网营销推广、网站重做改版、安丘网站定制设计、自适应品牌网站建设、H5响应式网站、购物商城网站建设、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为安丘等各大城市提供网站开发制作服务。文章目录定义在函数外面的变量。
1.2生存期与作用域 具有全局(任何函数内部)的生存期和作用域。
代码测试
#include#include//定义一个全局变量
int gAll=12;
void f(void);
int main()
{printf("in %s gAll=%d\n", __func__,gAll);
f();
f();
printf("agn in %s gAll=%d\n", __func__,gAll);
return 0;
}
void f(void)
{printf("in %s gAll=%d\n", __func__,gAll);
gAll+=2;
printf("agn in %s gAll=%d\n", __func__,gAll);
}
输出结果
in main gAll=12
in f gAll=12
agn in f gAll=14
in f gAll=14
agn in f gAll=16
agn in main gAll=16
注意
输出所在函数的函数名用 func ,
前后是 2个英文半角状态的“_”。
自动:没有初始化的会自动初始化为0,指针初始化为NULL;
人为:用编译时刻已知的值对全局变量初始化,在main函数之前初始化。
如果函数内部有与全局变量同名的变量,则全局被隐藏。
小范围与大范围定义了一样的变量名,大范围变量被隐藏,执行小范围的变量。
代码测试
#include#includeint gAll=12; //定义全局变量,大范围
void f(void);
int main()
{printf("in %s gAll=%d\n", __func__,gAll);
f();
printf("agn in %s gAll=%d\n", __func__,gAll);
return 0;
}
void f(void)
{int gAll=1; //函数内部定义同名的本地变量,小范围
printf("in %s gAll=%d\n", __func__,gAll);
gAll+=2;
printf("agn in %s gAll=%d\n", __func__,gAll);
}
输出结果
1.5局部变量in main gAll=12 //全局变量
in f gAll=1 //函数内部的本地变量
agn in f gAll=3 //函数内部的本地变量
agn in main gAll=12 //重新返回main,全局变量取消隐藏
(1)局部变量只能在定义的区域以及他的子区域中使用;
(2)包括:一个函数内部定义的函数、函数形参、复合语句即{ }大括号中的变量;
(3)同一个区域不能定义相同的名字;
(4)不同区域定义相同的名字变量,在本质没有任何关系。
在本地变量定义时前面加上static修饰符就变成了静态本地变量。
2.2生存期与作用域 生存期:全局,当函数离开时,静态本地变量会继续保持他最后的值;
作用域:定义函数内部;(static的意思是局部区域访问)
初始化:静态本地变量的初始化只会在第一次进入这个函数的时候做,以后进入函数时,会保持上次离开函数的值。
代码测试
int gAll=12;
void f(void);
int main()
{f();
f();
f();
return 0;
}
void f(void)
{static int all=1;
printf("in %s all=%d\n", __func__,all);
all++;
printf("in %s all=%d\n", __func__,all);
}
输出结果
2.3实际上静态本地变量是一种特殊的全局变量in f all=1
in f all=2
in f all=2
in f all=3
in f all=3
in f all=4
静态本地变量和全局变量的地址挨着,即他们两个在内存中放在一起,在内存相同的区域
代码测试
#include#includeint gAll=12;
void f(void);
int main()
{f();
return 0;
}
void f(void)
{static int all=1;
int b=2;
printf("in %s &gAll=%p\n", __func__,&gAll);
printf("in %s &all=%p\n", __func__,&all);
printf("in %s &b=%p\n", __func__,&b);
}
输出结果
3.返回指针的函数 3.1返回本地变量的指针in f &gAll=0000000000403010
in f &all=0000000000403014 //全局变量的地址 挨着 静态本地变量的地址
in f &b=000000000062FDEC
这种做法是危险的,因为当你离开这个函数,本地变量的空间会被free掉,当定义下一个变量的时候,会直接放在这个内存空间里面,所以可能还是原来的值,也可能不是原来的值。
代码测试
#include#includeint *g(void);
void f(void);
int main()
{int *p=g();
printf("*p=%d\n",*p);
f();
printf("*p=%d\n",*p);
return 0;
}
int *g(void)
{int i=1;
return &i;
}
void f(void)
{int k=12;
printf(" k=%d\n",k);
}
输出结果
3.2返回全局变量和静态本地变量的地址是安全的*p=1
k=12
*p=12 原来地址被后来定义的k占用
他们的指针和函数没有关系
3.3返回malloc的指针内存是安全的,但是容易出现问题
3.4最好的方法是 返回传入的指针 4.全局变量tips 4.1不要使用全局变量的来传递函数的参数和结果 4.2尽量避免使用全局变量“丰田汽车的案子”代码中使用了大量的全局变量,无法维护
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧