C语言入门-全局变量

一、全局变量

  1. 定义在函数外面的变量是全局变量
  2. 全局变量具有全局的生存期和作用域
  3. 它们与任何函数无关,在任何函数内部都可以使用它们
#include <stdio.h>

int f(void);


// 全局变量
int gALL = 12;


int main(int argc, char const *argv[])
{
	printf("in %s gALL=%d\n", __func__,gALL);
	f();

	printf("agn in %s gALL=%d\n", __func__,gALL);

	return 0;
}

int f(void)
{
	printf("in %s gALL=%d\n", __func__,gALL);
	gALL += 8;
	printf("agn in %s gALL=%d\n", __func__,gALL);
	return gALL;
}


// in main gALL=12
// in f gALL=12
// agn in f gALL=20
// agn in main gALL=20

二、全局变量初始化

  1. 没有做初始化的全局变量会得到0值
  2. 指针会得到NULL值
  3. 只能用编译时刻已知的值来初始化全局变量
  4. 它们的初始化发生在main函数之前

三、被隐藏的全局变量

如果函数内部存在与全局变量同名的变量,则全局变量被隐藏

#include <stdio.h>

int f(void);


// 全局变量
int gALL = 12;


int main(int argc, char const *argv[])
{
	printf("in %s gALL=%d\n", __func__,gALL);
	f();

	printf("agn in %s gALL=%d\n", __func__,gALL);

	return 0;
}

int f(void)
{
    // 这里定义一个名字相同的变量,那么全局的就被隐藏了
	int gALL = 1;
	printf("in %s gALL=%d\n", __func__,gALL);
	gALL += 8;
	printf("agn in %s gALL=%d\n", __func__,gALL);
	return gALL;
}
// in main gALL=12
// in f gALL=1
// agn in f gALL=9
// agn in main gALL=12

四、静态本地变量

  1. 在本地变量定义时加上static修饰符就成为静态本地变量
  2. 当函数离开的时候,静态本地变量会继续存在并保持其值
  3. 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开的值
#include <stdio.h>

int f(void);

int main(int argc, char const *argv[])
{
	f();
	f();

	return 0;
}

int f(void)
{
	static int all = 1;
	printf("in %s all=%d\n", __func__,all);
	all += 9;
	printf("agn in %s all=%d\n", __func__,all);
	return all;
}
// in f all=1
// agn in f all=10
// in f all=10
// agn in f all=19

注意事项

  1. 静态本地变量实际上是特殊的全局变量
  2. 它们位于相同的内存区域
  3. 静态本地变量具有全局的生存期,函数内的局部作用域
  4. static在这里的意思就是局部作用域(本地可以访问)

五、后记:返回指针的函数

  1. 返回本地变量的地址是危险的
  2. 返回全局变量或静态本地变量的地址是安全的
  3. 返回在函数内malloc的内存是安全的,但是容易造成问题
  4. 最好的做法是返回传入的指针

下面的写法就是很危险的

#include <stdio.h>

int* f(void);
void g(void);

int main(int argc, char const *argv[])
{
	int *p = f();
	printf("*p = %d\n", *p);
	g();
	printf("*p = %d\n", *p);

	return 0;
}

int* f(void)
{
	int i = 12;

	// 返回本地变量的地址是危险的
	return &i;
}

void g(void)
{
	int k = 24;
	printf("k = %d\n", k);
}

// *p = 12
// k = 24
// *p = 24

tips

  1. 不要使用全局变量来在函数间传递参数和结果
  2. 尽量避免使用全局变量
  3. 使用全局变量和静态本地变量的函数是线程不安全的
posted @ 2019-10-29 22:06  达达i  阅读(1334)  评论(0编辑  收藏  举报