C语言变量的存储类型

来源:互联网 发布:sql数据库误删除恢复 编辑:程序博客网 时间:2024/09/21 09:04

变量的存储类型

“这些都是用来修饰变量的,修饰函数的时候,其可能有不同的含义,请加以区分,后面会针对修饰函数来进行总结”

存储类型 变量 说明 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

以上结果可以看出来整个变量存储类型的分配和作用域,具体结果分析不在赘述,在代码块中已经详细进行讲解,谢谢

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 温州车在上海年审手续怎么办 广东小高考考了d怎么办 深圳开摩托抓到怎么办 深圳车卖了车牌怎么办 a1驾照时期过了怎么办 b1驾照扣了12分怎么办 北京的驾照换证怎么办 b2汽车驾驶证年审过期几天怎么办 上海驾照到期人在外地怎么办 交警开的罚单交不了怎么办 珠海交警微信交罚单扣分怎么办 驾驶证违法罚款单子没有了怎么办 转账密码输错3次怎么办 汽车违章扣6分怎么办 汽车扣了72分年检怎么办 汽车扣了50分怎么办 汽车扣了15分怎么办 汽车扣了27分怎么办 汽车扣了40分怎么办 行驶证掉了怎么办 异地 高速上没带驾驶证行驶证怎么办 身份证驾驶证行驶证都丢了怎么办 驾驶证年审过期一个月怎么办 柴油车辆年检尾气不合格怎么办 驾驶证过期了5天怎么办 过了审车时间怎么办 骑车没带行驶证怎么办 轿车行驶证丢了怎么办 车子没年检被扣怎么办 上海车辆年检过期了怎么办 行驶证过期十天怎么办 行驶证盖章满了怎么办 驾照c证扣12分怎么办 两年小车忘年审怎么办 4年车检过期了怎么办 车检过期了1周怎么办 超过检车几天了怎么办 驾驶证扣两个6分怎么办 行驶证检验有效期过期怎么办 驾驶证被扣26分怎么办 c1驾驶证扣26分怎么办