一些知识点记录

来源:互联网 发布:什么是涉密网络 编辑:程序博客网 时间:2024/06/01 18:38
局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式初始化,例如: 
例如,全局变量pi这样初始化是合法的: 
 double pi = 3.14 + 0.0016;   
 但这样初始化是不合法的: 
 double pi = acos(-1.0);   
局部变量这样初始化却是可以的。 
 程序开始运行时要用适当的值来初始化全局变量,所以初始值必须保存在编译生成的可执行文件中,因此初始值在编译时就要计算出来,然而上面第二种初始化的值必须在程序运行时调用acos函数才能得到,所以不能用来初始化全局变量。请注意区分编译时和运行时这两个概念。为了简化编译器的实现,C语言从语法上规定全局变量只能用常量表达式来初始化。   
如果全局变量在定义时不初始化则初始值是0,如果局部变量在定义时不初始化则初始值是不确定的。 
栈 (高内存地址) 空洞 堆 
BSS段(未初始化数据段,用0填充) .data数据段 
.text文本段 (低内存地址)   
  
关于不同类型的变量在内存中的位置: 
1. 全局变量 已初始化 位于.data数据段;未初始化 则位于.bss未初始化数
据段。 
2. 静态(static)全局变量也在.data数据段。 
3. 局部变量 在栈上。静态局部变量,并不是在调用函数时分配,在函数返
回时释放,而是像全局变量一样静态分配,在.data数据段,但它的作用域只在函数中起作用。 
4. const修饰的全局变量在.rodata只读数据段(const变量在定义时必须初
始化,所以没有所谓的未初始化const变量),只读数据段在和.text同一个Segment.