当前位置:嗨网首页>书籍在线阅读

28-本章小结

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

12.7 本章小结

内存用于存储程序中的数据,由存储期、作用域和链接表征。存储期可以是静态的、自动的或动态分配的。如果是静态存储期,在程序开始执行时分配内存,并在程序运行时都存在。如果是自动存储期,在程序进入变量定义所在块时分配变量的内存,在程序离开块时释放内存。如果是动态分配存储期,在调用 malloc() (或相关函数)时分配内存,在调用 free() 函数时释放内存。

作用域决定程序的哪些部分可以访问某数据。定义在所有函数之外的变量具有文件作用域,对位于该变量声明之后的所有函数可见。定义在块或作为函数形参内的变量具有块作用域,只对该块以及它包含的嵌套块可见。

链接描述定义在程序某翻译单元中的变量可被链接的程度。具有块作用域的变量是局部变量,无链接。具有文件作用域的变量可以是内部链接或外部链接。内部链接意味着只有其定义所在的文件才能使用该变量。外部链接意味着其他文件使用也可以使用该变量。

下面是C的5种存储类别(不包括线程的概念)。

  • 自动 ——在块中不带存储类别说明符或带 auto 存储类别说明符声明的变量(或作为函数头中的形参)属于自动存储类别,具有自动存储期、块作用域、无链接。如果未初始化自动变量,它的值是未定义的。
  • 寄存器 ——在块中带 register 存储类别说明符声明的变量(或作为函数头中的形参)属于寄存器存储类别,具有自动存储期、块作用域、无链接,且无法获取其地址。把一个变量声明为寄存器变量即请求编译器将其存储到访问速度最快的区域。如果未初始化寄存器变量,它的值是未定义的。
  • 静态、无链接 ——在块中带 static 存储类别说明符声明的变量属于“静态、无链接”存储类别,具有静态存储期、块作用域、无链接。只在编译时被初始化一次。如果未显式初始化,它的字节都被设置为 0
  • 静态、外部链接 ——在所有函数外部且没有使用 static 存储类别说明符声明的变量属于“静态、外部链接”存储类别,具有静态存储期、文件作用域、外部链接。只能在编译器被初始化一次。如果未显式初始化,它的字节都被设置为 0
  • 静态、内部链接 ——在所有函数外部且使用了 static 存储类别说明符声明的变量属于“静态、内部链接”存储类别,具有静态存储期、文件作用域、内部链接。只能在编译器被初始化一次。如果未显式初始化,它的字节都被设置为 0

动态分配的内存由 malloc() (或相关)函数分配,该函数返回一个指向指定字节数内存块的指针。这块内存被 free() 函数释放后便可重复使用, free() 函数以该内存块的地址作为参数。

类型限定符 constvolatilerestrict_Atomicconst 限定符限定数据在程序运行时不能改变。对指针使用 const 时,可限定指针本身不能改变或指针指向的数据不能改变,这取决于 const 在指针声明中的位置。 volatile 限定符表明,限定的数据除了被当前程序修改外还可以被其他进程修改。该限定符的目的是警告编译器不要进行假定的优化。 restrict 限定符也是为了方便编译器设置优化方案。 restrict 限定的指针是访问它所指向数据的唯一途径。