内存管理—变量作用
一、普通局部变量
include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 10;
if(1)
{
int a = 11;
//就近原则
printf("a = %d\n", a);//a = 11
}
//1、if()的a只能在if{}中使用
//2、离开if{},if的a已经释放
printf("a = %d\n", a);//a = 10
return 0;
}
int main01(int argc, char const *argv[])
{
//1、在{}内部定义的变量就是局部变量
//2、只有执行到定义变量的这个语句,系统才会给这个变量分配空间
//3、当离开{},这个非static局部自动释放
//4、局部变量的作用域在当前的{},离开此{},无法使用此变量
//5、{}的普通局部变量,加不加auto关键字等价,普通局部变量也叫自动变量
//6、不同的{}中,变量的名字可以一样,可以把{}类比成一个房子,不同房子可以有同名的小伙伴
//7、如果局部变量不初始化,它的值默认为随机值
auto int tmp;//加不加auto关键字等价
{
int a = 10;
{
a = 11;//ok,还在作用域范围内
}
}
//a = 11;//err,离开作用域
/********************************************************/
if(1)
{
int b = 10;
}
//b = 11;//err,离开作用域
/********************************************************/
for (int i = 0; i < 10; ++i)
{
/* code */
}
printf("i = %d\n", i);//err,i是属于for语句作用域的,离开后也是无效
return 0;
}
二、static局部变量
普通局部变量和static局部变量区别:
1、内存分配和释放
a)普通局部变量只有执行到定义变量的语句才分配空间
b)static局部变量在编译阶段(函数还没有执行),变量的空间已经分配
c)普通局部变量离开作用域{},自动释放
d)static局部变量只有在整个程序结束才自动释放
2、初始化
a)普通局部变量不初始化,值为随机值
b)static局部变量不初始化,值为0
c)static局部变量初始化语句只有第一次执行时有效
d)static局部变量只能用常量初始化
#include <stdio.h>
void fun()
{
int i = 0;
i++;
printf("i = %d\n", i);
}
void static_fun()
{
//1、在{}内部定义的变量就是局部变量
//2、static局部变量,是在编译阶段就已经分配空间,函数没有调用前,它已经存在
//3、当离开{},static局部变量不会释放,只有程序结束,static变量才自动释放
//4、局部变量的作用域在当前的{},离开此{},无法使用此变量
//5、不同的{}中,变量名字可以一样,可以把{}类比房子,不同房子可以有同名的小伙伴
//6、如果static局部变量不初始化,它的值默认为0
//7、static局部变量初始化语句,只会执行一次,但是可以赋值多次
//8、static变量只能用常量初始化(注意)
static int i = 0;
i++;
printf("static_fun i = %d\n", i);
int a = 10;
//static int j = a; //err, 使用变量a给static变量j初始化
}
void fun2()
{
static int i = 0;
}
int main(int argc, char *argv[])
{
static_fun();
static_fun();
static_fun();
return 0;
}
三、普通全局变量(外部链接)
全局变量的声明和定义:
#include <stdio.h>
//1、定义一个全局变量,建议初始化
int a = 10;
//2、如果声明一个全局变量,建议加extern
extern int a;
int main(int argc, char const *argv[])
{
return 0;
}
四、static全局变量(内部链接)
1、static全局变量和普通变量的区别就是作用域不一样(文件作用域)
2、extern关键字只适用于普通全局变量
3、普通全局变量,所有文件都能使用,前提需要声明
4、static全局变量只能本文件使用,别的文件不能使用
5、不同文件只能出现一个全局变量的定义
6、一个文件只能有一个static全局变量的定义,不同文件间的static全局变量,就算名字相同,也是没有关系的2个变量
五、普通函数和static函数的区别(文件作用域)
1、所以文件只能有一次普通函数的定义
2、一个文件可以有一个static函数的定义
3、普通函数所以文件都能调用,前提是使用声明
4、static函数只能在定义所在的文件中使用
六、extern函数和static函数的区别(作用域)
1、extern函数所有文件都是调用,所有文件只能出现一次extern函数定义
2、static函数只能在定义所在的文件中调用此函数,不同文件,可以定义一次static函数