知识点一:内存分区
知识点二:变量在内存分析
1、普通局部变量
定义形式:在函数里面定义的普通变量就是普通局部变量
void test01 ( )
{
int numl=10; //普通局部变量
}
作用范围:离它最近的 {} 之间有效
生命周期:离它最近的 {} 之间有效,离开 {} 的局部变量系统自动回收
存储区域:栈区
普通局部变量不初始化内容不确定
普通局部变量同名 就近原则(同一个{}里的)
void test01()
{
//局部变量,不初始化 内容 不确定
int data;
printf("data = %d\n",data); //-858993460
}
void test0l ()
{
//局部变量同名就近原则
int data= 100;
{
int data = 200;
printf("A:data = %d\n", data) ; //200
}
printf("B:data = %d\n", data) ; //100
}
2、普通全局变量
定义形式:定义在函数外边的变量就是普通全局变量
int data;//普通全局变量 在函数外边定义
void test02()
{
}
作用范围:
1)当前源文件都有效
全局变量声明的时候最好也加上extern(用于区别)
如果函数在全局变量定义的上方,如果没有变量声明则不可用,声明时注意不要赋值
2)其他源文件使用全局变量时,必须加 extern 声明
extern本质:告诉编译器 变量、函数 来至其他源文件
生命周期:整个 进程 都有效(程序结束的时候全局变量才被释放)
存储区域:全局区
注意事项:
1)全局变量不初始化内容为 0
2)如果全局变量要在其他源文件中使用必须在所使用的源文件中加extern声明
3)如果全局变量和局部变量同名 在 {} 中优先使用局部变量
3、静态局部变量
定义形式:在函数中定义前面必须加 static 修饰这样的变量叫静态局部变量
作用范围:离它最近的 {} 之间有效
生命周期:整个进程(程序结束的时候静态局部变量才被释放)
存储区域:全局区
静态局部变量不初始化内容为0 (全局区)
只能被初始化一次(重要)
void test01 ()
{
static int num;//静态局部变量
return ;
}
#include<stdio.h>
void fun1(void)
{
//静态局部变量只能被初始化一次
static int num = 10; //静态局部变量
num++;
printf("num = %d\n",num);
return;
}
int main(int argc,char *argv[])
{
fun1();
fun1();
fun1();
}
4、静态全局变量
定义形式:在函数外边定义同时加 static 这样的变量就是静态全局变量
作用范围:当前源文件有效 不能在其他源文件 中使用
生命周期:整个进程(程序结束 静态全局变量才被释放)
存储区域:全局区
静态全局变量不初始化内容为 0
静态全局变量只在当前源文件有效
#include<stdio. h>
static int data = 10;//静态全局变量
int main(int argc, char *argv[ ])
{
return 0;
}
知识点三:函数在内存分析
1、全局函数(普通函数)
特点:其他源文件可以使用全局函数,必须加 extern 声明
void my_ fun(void )
{
printf("(全局函数)普通函数\n");
return;
}
2、静态函数 (局部函数)
特点:只能在当前源文件使用,不能在其他源文件使用
注意:如果想在其他源文件调用静态函数,需要将静态函数封装在全局函数中,同时全局函数和静态函数必须是同一个源文件
static void my_static_fun(void)
{
printf("(静态丽数)局部函数\n");
return;
}