Linux & 标准C语言学习 <DAY9_2>

一、进程映像
    程序:存储在磁盘上的可执行文件(二进制文件、脚本文件)
    进程:正在系统中运行的程序

    进程映像:进程的内存分布情况
        text(代码段):
            翻译后的二进制指令、常量,权限是只读,如果强制修改会产生段错误
        data(数据段):
            初始化的全局变量、初始化的静态全局变量
        bss(静态数据段):
            未初始化的全局变量,在该段内存中的数据开始前会自动清零
        stack(栈):
            局部变量、块变量,会随着程序的运行不断申请、释放
        heap(堆):
            程序员手动申请和释放的内存,使用麻烦

    变量:
        全局变量:定义在函数外的变量
            存储位置:data(初始化)或者bss(未初始化,赋0)
            生命周期:程序开始到程序结束
            适用范围:程序的任意位置都可以使用
        局部变量:定义在函数内的变量
            存储位置:stack
            生命周期:从函数开始到函数结束
            适用范围:只能在该函数内使用
        块变量:定义在if/for/while等语句块内的变量
            存储位置:stack
            生命周期:从语句块开始到语句块结束
            适用范围:只能在该语句块内使用

        注意:同名的局部变量会屏蔽同名的全局变量,同名的块变量会屏蔽同名的局部变量和全局变量
   
二、类型限定符:
    auto
        用于定义自动申请、自动释放的变量(局部变量),不加就代表加了
        注意1:在C11语法标准中用于自动类型识别
        注意2:不能用它修饰全局变量

    extern
        用于声明外部变量,告诉编译器此变量在其它程序中已经定义,先通过编译,但如果在连接时找不到该变量依然会报错

    static
        改变存储位置
            改变局部变量的存储位置,由stack改为data(初始化)或者bss(未初始化,赋0)
        延长生命周期:
            延长局部变量的生命周期,直到程序结束才释放
        限制作用范围:
            限制全局变量的使用范围,限制只能在本文件内使用
            注意:使用static修饰全局变量,可以防止该变量被别的文件使用,以防止别的文件使用

     const
        "保护"变量的值不被显示地修改
        注意1:如果通过内存进行修改,还是可以改的
        注意2:使用const修饰data段数据,那么该数据会存储到text段中,如果强制修改会产生段错误

    volatile
        C编译器会对普通变量的取值进行"取值优化",只要在使用变量过程中该变量没有显示改变,那么编译器会直接使用上一次的结果,而不会每次去都去内存读取数据
        加上volatile修饰,让编译器不要对该变量进行"取值优化",一般在驱动编程、硬件编程、多线程编程中使用

    register
        内存介质:
            硬盘->内存->高级缓存->寄存器->CPU
        申请把变量的存储介质由内存改为寄存器,但是由于寄存器数量有限,不一定百分之百成功
        注意:寄存器变量不能取地址

    typedef
        类型重新定义
        在定义变量前加上typedef,那么原本的变量名就变成了这种数据类型,可以像数据类型一样定义变量
posted @ 2023-03-08 17:17  Phonyeee  阅读(11)  评论(0编辑  收藏  举报