我是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和addr6保存为未初始化的var,并且在函数scoop之外,它们不应该保存在BSS段中吗? 如果是这样,isnt bss段就像我们去的那样增长,因为它在堆中?
不应该比addrs5更大,因为它稍后被初始化了吗?
谢谢。答案 0 :(得分:1)
不,.bss
段不在堆中。 .bss
段和.data
段是固定大小的段,通常在地址空间中靠近堆,但它们明显不同于堆。
不,.bss
细分不会增长。您在程序中定义的全局变量的数量在程序执行期间保持不变。如果您加载动态库,那么该动态库将拥有自己的.bss
段,该段将放置在地址空间中的另一个位置。