根据变量的作用域(空间)划分:局部变量 & 全局变量
根据变量的生命周期划分:静态存储 & 动态存储
什么是静态存储和动态存储呢?
静态存储:是指在程序的运行期间给变量分配固定的存储空间。
动态存储:是指在程序的运行期间根据需要动态为变量分配存储空间。
对于静态变量的说明:
静态变量必须用关键字static声明,存储方式是静态存储方式。
静态全局变量 vs 非静态全局变量
二者都是全局变量,因为全局变量都是静态存储的,所以这二者也都是静态存储,即存储方式相同。
不同之处在于二者的作用域不同,如果一个源程序由多个源文件组成,那么静态全局变量的作用域只限于所在的源文件;非静态全局变量的作用域则是所有源文件。
所以为了避免不同源文件之间的互相干扰,最好使用静态全局变量。
静态局部变量 vs 非静态局部变量
二者都是局部变量,相同点:作用域只限于所在的函数。
不同点:
存储方式不同,静态局部变量属于静态存储;非静态局部变量属于动态存储。
生命周期不同(就是根据生命周期的不同,变量存储方式分为静态存储和动态存储),静态局部变量生命周期由程序决定,函数调用完成后,变量仍然存活,且只能由所在的函数使用,所以如果再次发生函数调用,变量的值仍是之前退出保存的值(常被用来作为计数器);而非静态局部变量,函数调用完成后生命周期结束。
变量的存储位置:静态全局、非静态全局和静态局部变量均存储在全局/静态区;非静态局部变量存储在栈中。这里应该明确变量有两个属性:数据类型和数据存储类别,一般存储类别容易被忽略,C语言中存储类别分为自动变量(auto),寄存器变量(Register),静态变量(static),外部变量(extern)。Auto定义在函数内部,也就是经常说的局部变量;Register保存在寄存器中,执行速度最快,不能通过&取地址,不常用;外部变量就是指的全局变量,可以被多个源文件访问,而静态全局则只能被所在文件访问。
ELF格式为例:
text:编译出来的机器码;
rodata:只读数据,比如你的字符串常量
data:已经初始化的全局变量和静态局部变量
bss:未初始化的全局变量和静态局部变量
这个文件和虚拟内存的映射关系是,以linux为例:
----------
| 内核 |
| 空间 |
----------
| 用户栈 |
----------
| 共享库 |
| 空间 |
----------
| 用户堆 |
----------
| bss |data和bss叫数据段,可读写
| data |
----------
| rodata|rodata和text叫代码段,只读。
| text |因为很多编译器会把rodata和text编译到一起,所以不一定分开
----------
| 不使用|
----------0地址
阅读(2901) | 评论(0) | 转发(0) |