C语言之存储类、链接和内存管理

用于存储程序数据的内存可用存储时期、作用域和链接来表征。存储时期可以是静态的、自动的或者分配的。如果是静态的,内存在程序开始执行时被分配,并在程序运行时一直存在;如果是自动的,变量所用内存在程序执行到该变量定义所在代码块时开始分配,在退出代码块时释放;如果是分配的内存,内存通过调用malloc()(或其他相关函数)分配,通过调用free()释放。

作用域决定了哪一部分程序可以访问某个数据。在所有函数之外定义的变量具有文件作用域,并对该变量声明之后定义的全部函数可见。在代码块内定义或者作为函数参量定义的变量具有代码块作用域,并只在该代码块及其子代码块中可见。

链接描述了程序的某个单元定义的变量可被链接到其他哪些地方,具有代码块作用域的变量作为局部变量,具有空链接。具有文件作用域的变量可有内部链接或外部链接。内部链接意味着只可在包含变量定义的文件内部使用。外部链接意味着变量也可在其他文件中使用。

下面是C的5种存储类:

  • 自动 —— 在一个代码块内(或在一个函数头部作为参量)声明的变量,无论有没有存储类型修饰符auto,都属于自动存储类。该类具有自动存储时期、代码块作用域和空链接。如未经初始化,它的值是不定的。
  • 寄存器 —— 在一个代码块内(或在一个函数头部作为参量)使用存储类修饰符register声明的变量属于寄存器存储类。该类具有自动存储时期、代码块作用域和空链接,并且无法获得其地址。把一个变量声明为寄存器变量可以指示编译器提供可用的最快访问。如未经初始化,它的值是不定的。
  • 静态、空链接 —— 在一个代码块内使用存储类修饰符static声明的变量属于静态空链接存储类。该类具有静态存储时期、代码块作用域和空链接,仅在编译时初始化一次。如未明确初始化,它的字节都被设定为0。
  • 静态、外部链接 —— 在所有函数外部定义、未使用存储类修饰符static的变量属于静态、外部链接存储类。该类具有静态存储时期、文件作用域和外部链接,仅在编译时初始化一次。如未明确初始化,它的字节都被设定为0。
  • 静态、内部链接 —— 在所有函数外部定义、使用存储类修饰符static的变量属于静态、内部链接存储类。该类具有静态存储时期、文件作用域和内部链接,仅在编译时初始化一次。如未明确初始化,它的字节都被设定为0。

分配内存是使用函数malloc()(或相关函数)提供的内存,该函数返回一个指向具有所请求字节数的内存块的指针。将这一内存块的地址作为参数来调用函数free(),可以使该内存块重新可用。

类型限定词说明符有const 、volatile 、restrict。说明符const将数据限定为不变的。在使用指针时,const可以表明指针本身不变或指针指向的数据不变,这取决于const在声明中的位置。说明符volatile表明数据除了可被程序修改外还可通过其他方式修改,其目的是警示编译器在优化时不要做出相反的假设。说明符restrict也是为了优化而设置。由restrict限定的指针被认为是提供了对其所指向的数据块的唯一访问途径。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值