c中的BSS段,进展方式

时间:2015-03-24 15:20:17

标签: c++ c memory-management assembly

我是c编程的新手,我试图更好地了解有关C程序内存布局的变量保存位置。

我收到了以下代码:

int addr5;              
int addr6;

/*code continues*/

int main (int argc, char** argv){

    printf("- &addr5: %p\n",&addr5);        
    printf("- &addr6: %p\n",&addr6);

/*code continues*/

现在,当我运行此代码时,我明白了:

  • & addr5:0x804a034
  • & addr6:0x804a030

现在,根据我的阅读,我得到堆内存从较低的值开始(随着我们继续增长) 并且堆栈内存从高值开始(随着我们继续下降)。

因为我将addr5和addr6保存为未初始化的var,并且在函数scoop之外,它们不应该保存在BSS段中吗? 如果是这样,isnt bss段就像我们去的那样增长,因为它在堆中?

不应该比addrs5更大,因为它稍后被初始化了吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

不,.bss段不在堆中。 .bss段和.data段是固定大小的段,通常在地址空间中靠近堆,但它们明显不同于堆。

不,.bss细分不会增长。您在程序中定义的全局变量的数量在程序执行期间保持不变。如果您加载动态库,那么该动态库将拥有自己的.bss段,该段将放置在地址空间中的另一个位置。