c语言全局变量和局部变量

参考《Linux c编程——一站式学习》第 19 章 汇编与C之间的关系 3. 变量的存储布局
 

局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式初始化,例如:

例如,全局变量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.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值