一些知识点记录

局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式初始化,例如: 
例如,全局变量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.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值