当前位置:   article > 正文

c语言编译bss和data,深入理解BSS段与data段的区别

bss和data

在解释bss段与data段区别前,先来看下他们定义,以及内存中的位置。

虚拟地址空间

在32位x86的Linux系统中,虚拟地址空间布局如下图所示:

ddfb284c1f7a

虚拟地址空间分布

bss段(bss segment):bss是Block Started by Symbol的简称,用来存放程序中未初始化的全局变量的内存区域,属于静态内存分配。

data段(data segment):用来存放程序中已初始化的全局变量的内存区域,属于静态内存分配。

text段(text segment):用来存放程序执行代码的内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。也有可能包含一些只读的常数变量,例如字符串常量等。

堆(heap):用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。

栈(stack):用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在data段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。

上面只是简单介绍了各个内存段,如果想详细了解,可以看这篇文章《深度解析内存中的程序》。

bss段与data段的区别

在初始化时 bss 段部分将会清零。bss 段属于静态内存分配,即程序一开始就将其清零了。

比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。

text 和 data 段都在可执行文件中,由系统从可执行文件中加载;

而 bss 段不在可执行文件中,由系统初始化。

上面这些理论可能有些抽象,下面我们通过示例代码来对比两者区别。

示例代码

#include

int bss_1;// 未初始化的全局变量,bss段

int bss_2 = 0;// 初始化为0的全局变量,bss段

int data_1 = 1;// 初始化非0的全局变量,data段

int main() {

static int bss_3;// 未初始化的静态局部变量,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/319577
推荐阅读
相关标签
  

闽ICP备14008679号