C_存储类别、链接和内存管理

 

一、存储类别

    1.作用域:描述程序中可访问标识符的区域

              1) 一个C变量的作用域可以是块作用域函数作用域函数原型作用域文件作用域

              2) 是用一对花括号括起来的代码区域(例:整个函数体、函数体的任意复合语句)

              3) 定义在中的变量具有块作用域,块作用域变量的可见范围是从定义处到包含该定义块的末尾

              4) 函数作用域仅用于goto语句的标签,一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数

              5) 函数原型作用域的范围是从形参定义处原型声明结束(只关心类型,不关心形参名(变长数组中形参名才有用))

              6) 全局变量:变量的定义在函数的外面,具有文件作用域,作用范围从定义处到该定义所在文件的末尾均可见

                  例: #include<stdio.h>

                       int sum = 0;                         ///全局变量:该变量具有文件作用域(func()和main()都可使用)

                       void func();

                       int main()

                      { ...}

                      void func()

                      {  ... }

              7) C预处理实际上是用包含的头文件内容替换#include指令

              8) 翻译单元: 编译器源代码文件(.c扩展名)所有的头文件(.h扩展名)都看成是一个包含信息的单独文件(翻译单元)

              9) 描述一个具有文件作用域的变量时,它的实际可见范围是整个翻译单元

             10) 如果程序由多个源代码文件组成,那么该程序也将由多个翻译单元组成

    2.链接

              1) C变量有三种链接属性: 外部链接内部链接无链接

              2) 具有块作用域函数作用域函数原型作用域的变量都是无链接变量(块、函数原型或函数私有)

              3) 具有文件作用域的变量可以是外部链接内部链接

              4) 外部链接变量可以在多文件程序中使用内部链接变量只能在一个翻译单元中使用

              5) 内部链接的文件作用域简称问文件作用域外部连接的文件作用域简称全局作用域

                  例:    int num = 5;                                             //文件作用域,外部链接变量

                           static int sum = 3                                    //文件作用域,内部链接变量

                           int main()

                           { ... }

    3.存储期

              1) C对象有四种存储期:静态存储期线程存储期自动存储期动态分配存储期

              2) 静态存储期: 在程序的执行期间一直存在

                       文件作用域变量具有静态存储期

                        无论是内部链接还是外部链接,所有的文件作用域变量都具有静态存储期

                        块作用域的变量也能具有静态存储期: 要把声明在块中的变量前面加上关键字static

              3) 线程存储期: 用于并发设计,程序执行可被分为多个线程

                       具有线程存储期的对象,从被声明时到线程结束一直存在

                       以关键字_Thread_local声明一个对象时,每个线程都获得该变量的私有备份

              4) 自动存储期:块作用域的变量通常都具有自动存储期

                      当程序进入定义这些变量的块时,为这些变量分配内存;当退出这个块时,释放刚才为变量分配的内存

                       变长数组的存储期从声明处到块的结尾,而不是从块的开始处到块的结尾

              例: 局部static变量

                     int func(void)

                     {

                     static int num = 0

                     }

                   // 变量num储存在静态内存中,它从程序被载入到程序结束期间都存在

                   // num的作用域定义在func()函数块中,只有在执行该函数时,程序才能使用num访问它所指的对象

                  // 该函数可以给其他函数提供该存储区的地址以便间接访问该对象(通过指针形参或返回值)

存储类别 存储期 作用域 链接 声明方式
自动 自动 块内
寄存器</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值