5-内存

46 阅读4分钟

知识点一:内存分区

内存分析

知识点二:变量在内存分析

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;
}