存储类、链接和内存管理

作用域

作用域描述了程序中可以访问一个标识符的一个或多个区域

  • 块作用域
    • 一对花括号括起来的区域,定义在块中的变量有块作用域
    • 函数的形式参数也属于块作用域
    • 局部变量具有块作用域
  • 函数作用域
    • 仅限于goto语句
    • 即使一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数
  • 函数原型作用域
    从形参定义到原型声明结束
  • 文件作用域
    • 变量定义在函数外面,具有文件作用域
    • 从它定义的位置开始,到文件结束
    • 也称为全局变量

链接

具有文件作用域的变量可能有外部或者内部链接

  • 外部链接
    可以在一个多文件程序的任何地方使用
  • 内部链接
    只能在一个翻译单元(一个源代码文件和它所包含的头文件)中使用
    需要注意定义与头文件包含的顺序问题,需要先定义后包含,头文件才能使用相应的变量
    内部链接不能用extern声明
  • 空链接
    代码块作用域、函数作用域、函数原型作用域的变量有空链接
    意味着它们是由其定义所在的代码块或者函数原型私有的

存储时期

  • 静态存储期
    程序执行期间一直存在
  • 线程存储期
    从被声明到线程结束一直存在
  • 自动存储期
    块作用域的变量通常具有自动存储期
    进入块时分配空间,退出时释放空间
  • 动态分配存储期

自动变量

自动存储期,块作用域,无链接
关键字:auto
如果编写兼容c++的程序,最好不要用auto关键字

寄存器变量

块作用域,无链接,自动存储期
关键字:register
请求成功则获得寄存器变量
失败则获得存储在内层的普通变量

函数的存储类别

外部函数

默认是外部函数
可以被其它文件访问

静态函数

只能用于所定义的文件

内联函数

定义在头文件中,可以重复包含

malloc

void *malloc(size_t size);
传入要分配的字节数,返回分配的地址,失败返回NULL

calloc

void *calloc(size_t n, size_t size);
分配N个 大小为SIZE的空间,并且全部初始化为0

free

释放分配的空间,否则造成内存泄漏

ANSI 类型限定符

const

定义普通变量时,该变量不能被改变
定义指针时,在*左侧,则指向的值不能被改变
*右侧,则指向不能被改变

volatile

通常用于硬件地址,以及在其它程序或同时运行的线程中共享数据

restrict

允许编译器优化某部分的代码以更好的支持计算
它只能用于指针,表明该指针是访问数据对象的唯一方式

_Atomic

当一个线程对一个原子类型的对象执行原子操作时,其他线程不能访问该对象

幂等

C99为类型限定符增加了幂等性,可以在一条声明中多次使用同一个限定符,多余的限定符将会被忽略

const const const const int a=10;
const int a = 10;
以上是等价的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值