Linux下的C语言程序开发主要有两个标准,一个是ISO C(所谓的ANSI C),另一个就是起初由IEEE开发的POSIX标准。大家有兴趣的可以去看一下相关的标准头文件说明。前者为可移植性提供了保证,这里主要简单的归结一下C语言的存储类型关键字的类型,作用范围,生存周期,存储位置(进程空间内)。
1. 首先提一下C语言的变量和函数的声明定义格式。
变量:存储类型 类型修饰符 数据类型 变量名 (auto signed int i )
函数: 存储类型 返回数据类型 函数名(参数1,....参数n)
2. 下面开始归结一下。(表示做表格做的很稀烂,就简单点了,忘见谅啊)
******* 存储类型 ******** 作用范围 ************生存周期 *********** 存储位置******
auto 变量 { func } 当前函数体内 存储在进程空间的栈区
extern函数 整个项目 整个程序运行期 code段
extern变量 整个项目 整个程序运行期 已经初始化的在data段,未初始化的在BBS段
static函数/全局变量 当前文件
整个程序运行期 函数在code段,全局变量同EXTERN变量
static局部变量 { func } 整个程序运行期 同EXTERN变量
register变量 { func } 当前函数体内 程序运行时存储在CPU寄存器中
常量 当前文件 整个程序运行期 code段
*******************************************************************************
PS:register关键字只能标识整型和字符型变量,并且只用于局部变量,被定义为register变量常驻CPU寄存器。有兴趣可以查一下编译器如何对关键字进行处理的,并且可以用相关的SIZE, readelf等命令查看这些段的信息。
3.进程空间粗略分布
栈区(向下增长) ↓ (高地址)
|
堆区(向上增长) ↑
|
BBS区
|
data区
|
代码区 (低地址)
|
表格给出的并不是一个完整的段区集合,有兴趣的看一下程序员的自我修养,有详细的讲解。
PS:对于堆和栈的区别简单的来说的话,就是前者是你的操作系统OS使用的,后者是程序员(如MALLOC分配)能用的。栈区是连续的区域,堆区存在着碎片。所以在使用堆区的时候,注意释放垃圾资源的空间。
阅读(3261) | 评论(0) | 转发(0) |