变量的存储类型
“这些都是用来修饰变量的,修饰函数的时候,其可能有不同的含义,请加以区分,后面会针对修饰函数来进行总结”
存储类型 | 变量 | 说明 |
---|---|---|
auto | 自动变量 | 局部变量在缺省的情况下会归为自动变量,默认是不会进行初始化,会产生随机值 |
static | 静态变量 | 在程序执行的时候存在,并且只要整个程序在运行,就可以继续访问该变量,默认是会进行初始化,并且只有一次 |
extern | 外部变量(全局变量) | 作用领域是整个程序,包括该程序的各个文件,生存周期非常长,它在该程序运行结束后,才开始释放内存,默认是会初始化并且初始化一次 |
register | 寄存器变量 | 存放在Cpu的寄存器当中,对于循环次数较多的循环控制变量以及循环体内部反复使用的变量可定义为及存取变量,只能是局部变量不能是全局变量,并且不能加static进行修饰,默认是不会进行初始化的 |
区分:
auto对局部变量的时候缺省会归类为自动变量,默认是不会进行初始化的,
static 生命周期是整个程序。默认是会初始化的
extern 如果为全局变量,缺省是默认归类为全局变量,默认会初始化的
register寄存器变量,不一定会申请成功。
如果想要深入的了解其中的原理的话,那我们必须首先来理解一下Linux下,内存管理部分的原理:
auto局部变量存储的地方是栈——–>不会初始化,栈的调用是循环利用的,有可能其中存储的是以前存储类型的数据。
而static和extern所存储的区域为数据段——–>会初始化
register不能定义成全局和静态的时候,说明他们存储的位置是不允许放入静态存储区域中的,生命周期仅仅局限在函数内部
如下图所示:Linux的内存分配:
下面我们来通过一个事例来看一下这写变量的存储类型:
#include<stdio.h>
#include<stdlib.h>
int global_variable_num;//全局变量,初始化为0,生命周期为软件运行周期
static int static_global_variable_num;//静态全局变量,初始化为0,生命周期软件运行
int *gloable_pointer;//全局指针变量,初始化为NULL,
void func();
int main(void){
printf("global_variable_num:%d\n",global_variable_num);
printf("static_global_variable_num:%d\n",static_global_variable_num);
printf("*gloable_pointer:%p\n",gloable_pointer);
global_variable_num++;
static_global_variable_num++;
/**调用三次func函数,系统会每次都会为函数分配一次函数栈空间,第一次运行完之后,栈空间会被释放,然后第二次运行的时候,系统会再次分配,而第二>次分配的空间与第一次的不一定属于一个空间。以此类推*/
func();
func();
func();
return 0;
}
void func(){
int patical_variable;//局部变量,默认是不会初始化的,系统会自动将其归类为自动变量
auto int auto_patical_variable;//局部自动变量,不会初始化
static static_patical_variable;//静态局部变量。系统会初始化一次,并且其生命周期是整个软件的周期,存储在数据段中的静态存储区域
printf("global_variable_num:%d,static_global_variable_num:%d\n",global_variable_num,static_global_variable_num);
printf("patical_variable:%d,auto_patical_variable:%d,static_global_variable_num:%d\n",patical_variable,auto_patical_variable,static_global_variable_num);
register int register_variable = 10;//寄存器变量。寄存器变量,寄存器变量生命周期属于函数内部。
register_variable++;
printf("register_variable:%d\n",register_variable);
static_global_variable_num++;
printf("static_global_variable_num:%d\n",static_global_variable_num);
}
输出结果为 :
global_variable_num:0
static_global_variable_num:0
*gloable_pointer:(nil)
global_variable_num:1,static_global_variable_num:1
patical_variable:158690944,auto_patical_variable:32671,static_global_variable_num:1
register_variable:11
static_global_variable_num:2
global_variable_num:1,static_global_variable_num:2
patical_variable:158690944,auto_patical_variable:32671,static_global_variable_num:2
register_variable:11
static_global_variable_num:3
global_variable_num:1,static_global_variable_num:3
patical_variable:158690944,auto_patical_variable:32671,static_global_variable_num:3
register_variable:11
static_global_variable_num:4
以上结果可以看出来整个变量存储类型的分配和作用域,具体结果分析不在赘述,在代码块中已经详细进行讲解,谢谢