#include<stdio.h>int f(void);
int gAll;
//int gAll = f(); //[Error] initializer element is not constant
//int g2 = gAll;//[Error] initializer element is not constant
//const int g1 = 12;
//int g3 = g1;//[Error] initializer element is not constant
//int g4 = g5;// [Error] 'g5' undeclared here (not in a function)
//const int g5 = 5;
int main(int argc, const char *argv)
{
printf("gAll = %d\n", gAll); // gAll = 0return0;
}
int f(){
gAll +=2;
}
3.被隐藏的全局变量
函数内部存在 与 全局变量 同名的变量,则全局变量被隐藏
#include<stdio.h>int f(void);
int gAll;
int main(int argc, constchar *argv)
{
printf("gAll = %d\n", gAll); // gAll = 0
f();
printf("after call f(), gAll = %d\n", gAll); // after call f(), gAll = 0return0;
}
int f(){
int gAll = 12;
printf("f() gAll = %d\n", gAll); // f() gAll = 12
}
4.静态本地变量
在本地变量定义时 加上static修饰符 就成为静态本地变量
当函数离开的时候,静态本地变量会继续存在 并保持其值
静态本地变量的初始化 只会在第一次进入这个函数时做,以后进入函数时 会保值上次离开的值
#include<stdio.h>int f(void);
int main(int argc, constchar *argv)
{
f();// in f all = 1 again in f all = 3
f();// in f all = 3 again in f all = 5return0;
}
int f(){
staticint all = 1;
printf("in %s all = %d\n", __func__, all);
all +=2;
printf("again in %s all = %d\n", __func__, all);
return all;
}
静态本地变量实际上是特殊的全局变量
它们位于相同的内存区域
静态本地变量 具有全局的生存期,函数内的局部作用域
#include<stdio.h>int f(void);
int gAll = 12;
int main(int argc, constchar *argv)
{
f();
return0;
}
int f(){
int k = 0;
staticint all = 1;
// 从地址看,静态本地变量是 全局的 printf("&gAll=%p\n", &gAll);// &gAll=0000000000403010printf("&all=%p\n", &all); // &all=0000000000403014printf("&k=%p\n", &k);// &k=000000000022FE1Cprintf("in %s all=%d\n", __func__, all); // in f all=1
all += 2;
printf("after +2, in %s all=%d\n", __func__, all); // after +2, in f all=3return all;
}
5. 关于函数输入输出的问题
5.1 返回指针的函数
返回本地变量的地址是危险的
返回全局变量 或 静态本地变量的地址 是安全的
返回在 函数内malloc的内存是安全的,但是容易造成问题
最好的做法是 返回传入的指针
#include<stdio.h>int* f(void);
void g(void);
int main(int argc, constchar *argv)
{
int *p = f();
printf("*p=%d\n", *p); // *p=12
g(); // k=24printf("*p=%d\n", *p); // *p=24return0;
}
// 返回本地变量的地址是危险的 int* f(void)
{
int i = 12;
return &i; // [Warning] function returns address of local variable [-Wreturn-local-addr]
}
void g(void)
{
int k = 24;
printf("k=%d\n", k);
}