33.内存分区和全局变量


内存分区

在程序没有执行之前,有几个内存分区已经确定,但是没有加载内存,程序只有在运行的时候才会加载到内存,静态区

  • text(代码区):只读,函数
  • data:初始化的数据,全局变量,static变量,文字常量区(只读)
  • bss:没有初始化的数据,全局变量,static变量

当运行程序,需要加载内存,将前面的三个分区加载,还额外加载两个分区,动态区

  • stack(栈区):普通局部变量,自动管理内存
  • heap(堆区):手动申请空间,手动释放,整个程序结束,系统也会自动回收

普通全局变量

普通全局变量

1.在{}外面定义的变量为全局变量
2.只要定义了该全局变量,任何地方都可以使用此变量,
3.如果使用变量时在前面找不到此全局变量的定义,需要声明才可以使用
4.全局变量不初始化,默认赋值为0
5.声明只是针对全局变量,不是针对局部变量
6.全局变量只能定义一次,可以声明多次
7.全局变量在编译阶段已经分配空间(函数没有执行前),只有整个程序结束,才自动释放
8.不同文件普通全局变量只能定义一次

#include
void fun2()
{
	extern int a;//声明时,不要赋值
	printf("fun2 a = %d\n", a);
}
int a = 10;//定义了一个全局变量
void fun()
{
	a = 11;//修改的是全局变量a
}
int main()
{
	fun();
	printf("%d\n", a);
	
}

全局变量的缺陷

int b;
int b;
int b;
int b;

有一次是定义,有三次是声明
如果定义了一个全局变量,没有赋值(初始化),无法确定是定义,还是声明
如果定义了一个变量,同时初始化,这个肯定是定义

全局变量声明和定义的建议写法
1.定义一个全局变量,建议初始化
2.如果声明一个全局变量,建议加extern

static全局变量

1.static与普通全局变量的区别就是作用域不一样(文件作用域)
2.extern关键字只适用于普通全局变量
3.一个文件只能有一个static全局变量的定义,一个文件不可以出现多个
4.static全局变量只能在当文件中使用
5.不同文件只能出现一个普通全局变量的定义
普通函数和static函数的区别
1.所有文件只能有一次普通函数的定义
2.一个文件可以有一个static的定义
3.普通函数所有文件都可以调用,关键是使用声明
4.static只能在定义所在的文件中使用

全局变量分文件编写

//main.c
#包含的是.h,而不是.c,因为一个文件可以声明多次,但是只可以定义一次
//include "test.h"
int main()
{
	test();
	a = 111;
}

//定义:
//test.c
int a = 0
int b = 0;
void test()
{
	a = 1;
	b = 2;
}
//声明
//test.h
包含各种声明
extern int a;
extern int b;
void test();
//main.c
int main(int agrc, char* argv[])
{
	//使用函数前,声明函数,声明函数,extern可有可无,声明可以多次
	extern void test();
	test();
	//使用全局变量前先声明
	a = 111;
	b = 3333;
	return 0;
}
//test.c
int a = 0;
int b = 0;
void test()
{
	a = 20;
	b = 20;
}
//可以一个一个的声明,但是这样很麻烦,可以包含在头文件中
//格式:#include "a.h"