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"