C中的BSS段,进展方式
BSS segment in c, way of progress
我是 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 段中吗?
如果是这样,bss 段不是随着我们的增长而增长吗,因为它在堆中?
addr6 不应该比 addrs5 大,因为它是稍后初始化的吗?
谢谢。
不,.bss
段不在堆中。 .bss
段和.data
段是固定大小的段,通常在地址space 中靠近堆,但它们与堆明显不同。
不,.bss
部分不会增长。您在程序中定义的全局变量的数量在程序执行期间保持不变。如果加载动态库,那么该动态库将有自己的 .bss
段,该段被放置到地址 space.
中的另一个位置
我是 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 段中吗? 如果是这样,bss 段不是随着我们的增长而增长吗,因为它在堆中?
addr6 不应该比 addrs5 大,因为它是稍后初始化的吗?
谢谢。
不,.bss
段不在堆中。 .bss
段和.data
段是固定大小的段,通常在地址space 中靠近堆,但它们与堆明显不同。
不,.bss
部分不会增长。您在程序中定义的全局变量的数量在程序执行期间保持不变。如果加载动态库,那么该动态库将有自己的 .bss
段,该段被放置到地址 space.