全局变量初始化相关的一个错误

全局变量初始化相关的一个错误

标签(空格分隔):Coding-Nissan


  • 全局变量初始化全局变量
    在C++中对于以下语句:
// 全局域
int i = 3;
int j = i;

  因为是全局变量,编译时会将i放入.data段,并设置其值为3.而对于j,编译器遇到这种非常量的全局变量初始化语句,只知道j=i,由于i是变量,不是常量,编译器无法在编译时直接得到它的值,即编译器不能够直接用3来初始化j。编译器无法在编译时求得一个非常量的值,它只能在运行时通过读取变量地址来间接得到变量的值,而全局变量在编译时就必须确定其值,故C有静态存储区数据必须用常量初始化的规定。
  由于j是全局变量,存储在静态存储区,因此也需要在编译时确定其值。而i是变量,不是常量,i的值无法在编译时确定,这就造成j的值也无法在编译时确定,所以C对此就会报错。而C++采取了另外一种做法,在编译时简单的把j作为未初始化的全局变量放入.bss区,其默认值为0,然后添加一条语句在运行时通过i的地址进而读取i的值,再赋给j。上述过程在 main函数开始之前执行。因此j 的初始化实际上实在运行时完成的。
【补充】
.data段:指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
.bss段:通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS段属于静态内存分配。
上述完整的过程可以概括为:

取i的地址,把3放到i的地址中,取i的地址,读取这个地址中的内容,取j的地址,把这个内容 写入j 的地址。

  • 全局变量初始化局部变量
int i = 3

int main()
{
    int j = i;
    ...
}

  在编译时不需要确定局部变量j的值,而是在运行时读取i的值来赋给j。编译连接后的可执行文件中不会存放j的值,只有相应的赋值语句的代码。与此相对的,由于i是全局变量,存储在静态存储区,因此在编译时其值就需要确定其值,在目标文件中会分配空间来存放i的值,运行时不会有赋值语句来给i赋值,没有对应的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值