全局变量、局部变量、动态内存、函数

一、全局变量、局部变量、动态内存、函数存放区域(内存区域)

首先我将通过以下简图对全局变量、局部变量、动态内存、函数的存放区域进行简单介绍

二、全局变量、局部变量、动态内存、函数的生命周期、作用域、默认值/链接属性

1.全局变量

(1)概念:定义在函数外面的变量.不建议使用。

(2)生命周期:从程序运行开始创建,程序结束才销毁,周期长。

(3)作用域:从定义开始直到文件结束都能使用。

(4)默认值/链接属性:普通全局变量和静态全局变量的默认值均为0,但普通全局变量的链接属性为外部(对外可见),静态全局变量的链接属性为内部(对外不可见)。

(5)内存区域:普通全局变量为栈(是对于外部的全局),静态全局变量为静态变量区

我将通过以下代码段对全局变量的各性质进行进一步分析:

 
#include"stdio.h"
int g_a = 10;//全局变量
static int g_b = 20;//静态全局变量
//for(int i=0;i<10;i++) ;//error  #下 函数上 不能直接有语句     编译从上往下进行

(
int g_n = 80;
static int gs_m = 90;//内部符号对外不可见
//该部分是在另一个源文件创建定义的,在下边主函数会用到,而调用时需用到引用外部符号extern,如下所示
)
extern int g_n;//引用外部符号
extern int gs_m;
int main()
{
	printf("%d,%d\n",g_a,g_b);
	
	printf("g_n=%d\n",g_n);//ok
	printf("gs_m=%d\n",gs_m);//error,因为在另一个源文件中定义gs_m时在前面加了static关键字,
        //所以其链接属性为内部,对外不可见,所以在此不能打印出来。

	
	return 0;
}

注:静态(static)C++修饰的只有一个链接属性,如果有链接属性,加上static关键字则由外部变为内部。

2.局部变量

(1)概念:定义在函数内部,包括形参,分为(普通局部变量和静态局部变量)

(2)生命周期:普通局部变量为:进入函数时创建,退出函数时销毁,静态局部变量为:进入函数时创建,程序退出时结束。

(3)作用域:本函数内部

(4)默认值/链接属性:普通局部变量无默认值,静态局部变量默认值为0,普通局部变量和静态局部变量均无连接属性。

(5)内存区域:普通局部变量为栈,静态局部变量为静态变量区

我将通过以下代码段对全局变量的各性质进行进一步分析:

void Fun()
{
	static int a = 0;
	a++;
	printf("%d\n",a);
}
int main()
{
	int a;  //普通局部变量,栈
	int b = 10;
	static int sa;//静态局部变量,静态变量区
	static int sb = 20;
	printf("%d\n",sa);

	for(int i=0;i<10;i++)
	{
		Fun();
	}//在此打印1-10,因为Fun函数中静态局部变量a在程序结束时才销毁,"static int a = 0;"
//该语句只执行一次,在程序二次进入时,该语句被忽视,因为a未被销毁,只需创建一次就好

//但当将"static int a = 0;"改为" int a = 0;"则打印10个1。因为这样的话,在程序每次进入时,都要进行创建。return 0;}

3.动态内存

(1)生命周期:什么时候需要,什么时候申请   (注:需要free,容易出现内存泄漏)

(2)默认值/链接属性:默认值为随机值,无链接属性

(3)内存区域:栈

4.函数

(1)概念:函数分为静态(内部函数,内部用)和非静态(外部函数,对外服务,在头文件中描述<需注意的是头文件只放声明,不放定义>)

内部函数和外部函数的区别:

<1>内部函数  不需要那么严格的检查,若检查,需要付出很大代价,加静态关键字static(静态关键字的主要应用,不对外提供服务)。

<2>外部函数  需进行严格的检查,放在头文件中让别人使用。

(2)内存区域:代码段

猜你喜欢

转载自blog.csdn.net/Aspiration_1314/article/details/79782959