为什么要把bss段清0

全局变量与静态变量没有初始化或初始化值为0时,都会放在.bss段。初始化为非0值,则放在.data段。
全局变量与静态变量没有初始化或初始化值为0时,都放在.bss段会产生一个问题: 假如说我们定义一个全局的变量 int a = 0;我们知道这是一个初始化值为0 的全局变量,那么他会被放在.bss段,由于存储在bss段内的数据在下一次启动代码时不会被自动的重新初始化为0(即bss段清0),这就可能导致上一次运行代码过程中有可能修改了全局变量或静态变量的值,而修改过的值会被bss段保存下来,那么在下一次启动代码事我们定义的那个全局变量的值就可能不是我们第一次定义的 “0”值了,这样的话就有可能导致一些问题。
举个例子:
int a = 0//全局变量,被放在bss段
void main(void)
{
    if(a == 0){
        printf("a=0");
        a = 1;
    }
else{ 
        printf("a != 0 ");
        a = 0;
    }
}
我们第一次运行程序时,是输出:a =  0,第二次再运行就输出:a != 0了,下一次再运行 又输出:a = 0 了,这样就导致同样的代码,在不同次的运行是产生不同的结果,这绝不是我们希望看到的。所以在初始化代码是我们要对bss段清0。这样每次运行是为初始化的全局变量、静态变量和初始化为0的全局变量、静态变量就默认全是0了,这样就不会导致上面例子中的那种情况。

如何对Bss段清零?在链接脚本中标记bss段的开始和结束位置,然后在初始化代码的时候把开始标记和结束标记之间的内容清0。
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值