C语言存储类、链接和内存管理总结
来源:互联网 发布:执行python脚本传参数 编辑:程序博客网 时间:2024/05/24 05:01
一、存储类
描述一个变量(一个数据对象):存储周期、作用域、链接。
作用域:一个C变量的作用域可以是代码块作用域(在函数内部代码块中定义的变量、形参,称为局部变量),函数原型作用域(从变量定义处一直到原型声明的末尾),或者文件作用域(一个在所有函数之外定义的变量,从定义处到包含定义的文件结尾处都可见,称为全局变量),函数作用域(只适应于goto语句使用的标签),函数作用域意味着一个特定函数中的goto标签对该函数中任何地方的代码都是可见的,无论该标签出现在哪一个代码块中。
链接:一个C变量具有以下链接之一,外部链接,内部链接或空链接。
具有代码块作用域和函数原型作用域的变量是空链接,由定义所在的代码块和函数原型所私有
具有外部链接的变量可以在多文件程序的任何地方使用,多个文件可有共享。
具有内部链接的变量可以在一个文件的任何地方使用,归该文件私有。
具有文件作用域的变量可能是内部链接或者外部链接。
如果一个具有文件作用域的变量用static修饰,则是内部链接,否则是外部链接。
存储时期:一个C变量具有以下两种存储时期之一,静态存储时期(在程序执行期间一直存在)和自动存储时期
静态存储时期:在程序执行期间一直存在。具有文件作用域(不管是内部链接还是外部链接)的变量具有此存储周期,注意对于具有文件作用域的变量,static标明连接类型不是存储时期。
自动存储时期:具有代码块作用域的变量一般是自动存储周期。在程序进入定义的变量代码块中时在栈中分配内存,退出时释放内存。
5种存储类
存储类
时期
作用域
链接
声明方式
自动
自动
代码块
空
代码块内
寄存器
自动
代码块
空
代码块内,使用关键字register
具有外部链接的静态
静态
文件
外部
所有函数之外
具有内部链接的静态
静态
文件
内部
所有函数之外,使用关键字static
空链接的静态
静态
代码块
空
代码块内,使用关键字static
自动变量:用auto修饰或者不修饰就默认属于自动存储类的变量具有自动存储周期、代码块作用域、空链接。在默认下,在代码快或者函数的头部定义的任意变量都属于自动存储类。
如果在内层中使用和外层一样名字的变量,则内层会覆盖外层变量,在程序离开内层代码块时,外部变量就恢复了其作用和之前的值。
对于自动变量,除非显示的初始化,否则不会自动初始化。
寄存器变量:通过register声明,放在寄存器而非内存中,所以无法获得其地址。注意,有时候虽然请求了把变量放于寄存器中,但是由于寄存器的个数,并不一定能满足,所以寄存器变量就成为了普通变量,不过依然不能对其取址。
具有代码块作用域的静态变量:通过static修饰,如果不现实对其初始化,则自动初始化为0(提供了静态时期),在代码块内声明(提供了代码块作用域和空链接),创建具有代码块作用域兼具静态存储的局部变量。这些变量具有代码块作用域,空链接,静态存储时期。变量一旦被定义便一直存在直到程序结束。
Int main(void)
{
Int count;
For(count = 1;conut < 4;count ++)
{printf(”count = %d\n”,count);
F();}
Return 0;
}
Void F(void)
{
Int fade = 1;
Static int stay = 1;
Printf(“fade = %d and stay = %d\n”,fade++,stay++);
}
结果:
Count = 1
Fade = 1 andstay = 1;
Count = 2
Fade = 1 andstay = 2;
Count = 3
Fade = 1 and stay = 3;
这是因为静态变量和外部变量在程序调入内存时已经就位了,把这个语句放在f()中是为了告诉编译器只有函数f()能看到该变量。
具有外部链接的静态变量:具有文件作用域、外部链接、静态时期(外部存储类,外部变量)。
额外说明,外部变量只可进行一次初始化,而且在定义的时候。
具有内部链接的静态变量:用static在所有函数的外部进行定义来创建,静态存储时期、文件作用域、内部链接。
二、存储类说明符
Auto 标明一个变量具有自动存储时期,该说明符只能用在具有代码块作用域的变量声明中。
Register 只能用在具有代码块作用域的变量。请求一个变量存储在寄存器中一边快速使用,但是不能获得改变量的地址。
Static 用于具有代码块作用域的变量声明时,使该变量具有静态存储时期,从而得以在程序运行期间存在并保留其值,变量仍保留代码块作用域和空链接。若用于具有文件作用域的变量声明时,使该变量具有内部链接。
Extern 表明在声明一个在其他地方定义了的变量。
Const 将数据定为不变的,在只能定义声明,以后不可改变其值。在指针中使用时,const的位置决定是指针本身不变还是指针指向的数据不变。
Volatile 说明数据除了可以被程序修改外还可以被其他代理修改,主要用于编译器优化。
Restrict 只能用于修饰指针,限定的指针被认为是提供了对其所在指向的数据块的唯一访问途径。
- C语言存储类、链接和内存管理总结
- C -- 存储类、链接和内存管理
- C语言学习笔记1——存储类、链接和内存管理
- 第十二章 存储类,链接和内存管理 总结 1406015
- C中的存储类、链接和内存管理
- C 存储类/链接/内存管理
- 存储类,链接和内存管理
- 存储类、链接和内存管理复习
- 存储类、链接和内存管理
- 存储类,链接和内存管理
- 存储类、链接和内存管理
- 存储类、链接和内存管理
- 存储类、链接和内存管理
- C语言的存储类和链接
- 【C Primer Plus】第十二章 存储类、链接和内存管理
- C primer plus第12章(存储类、链接和内存管理)
- C primer plus第12章(存储类、链接和内存管理)习题
- C Primer Plus第12章 存储类、链接和内存管理随笔
- 你最近在读什么书,及CSAPP上的一个疑问
- 'localtime': This function or variable may be unsafe. Consider using localtime_s instead.
- OK6410编译内核
- Android手势源码浅析-----手势绘制(GestureOverlayView)
- Win 7下过盛*大,H*S驱动保护
- C语言存储类、链接和内存管理总结
- mysql存储过程详解
- 枚举的几大用法
- C语言全局变量多文件使用
- HDOJ2602 Bone Collector
- Android MediaScanner 详尽分析
- php连接mysql提示Call to undefined function mysql_connect()
- UVA 400 Unix ls
- string 方法使用总结