.bss段中的“bss”是Block Started by Symbol的首字母缩写。bss段是计算机程序中一个特殊的内存段,它主要用于存放程序中未初始化的全局变量和静态变量。这些变量在程序开始执行之前,由操作系统或链接器自动初始化为0(或在某些情况下为某个特定的未初始化状态)。与已初始化的全局变量(通常存放在.data段)不同,未初始化的全局变量在程序的二进制文件中不会占用空间来存储它们的初始值,因为它们的初始值是已知的(即0)。然而,在程序运行时,这些变量需要在内存中分配空间,以便程序能够正确地访问和修改它们。
.bss段的特点包括:
- 可读写的:.bss段中的变量在程序运行时是可以被读写的。
- 自动初始化:在程序开始执行之前,.bss段中的变量会被自动初始化为0(或在某些特定情况下为其他未初始化状态)。
- 不占用磁盘空间:在程序的二进制文件中,.bss段不会占用空间来存储变量的初始值
明确“不占用物理文件尺寸但占用内存空间”这一表述的含义。在编程和链接的上下文中,这通常意味着:
-
不占用物理文件尺寸:指的是在程序的二进制文件(如可执行文件或库文件)中,这个段不会占用任何磁盘空间来存储它们的初始值。这是因为这些段通常用于存储未初始化的全局变量或静态变量,它们的初始值默认为0。由于这些变量的初始值已知且固定(为0),因此没有必要在二进制文件中为它们存储这些值。
-
占用内存空间:当程序被加载到内存中并执行时,这些段会在内存中分配空间。这是因为这些变量在程序运行期间需要被访问和修改。尽管它们在磁盘上的二进制文件中没有占用空间,但在内存中它们必须存在,以便程序能够正确地使用它们。
#include <stdio.h>
// 未初始化的全局变量,存放在.bss段中
int globalVar;
int main() {
// 访问并修改.bss段中的变量
printf("Before initialization, globalVar = %d\n", globalVar); // 输出0,因为globalVar在.bss段中被自动初始化为0
globalVar = 10; // 修改globalVar的值
printf("After initialization, globalVar = %d\n", globalVar); // 输出10
return 0;
}
在这个程序中,我们定义了一个未初始化的全局变量globalVar
。由于它没有被显式地初始化,因此它会被存放在.bss段中。在程序开始执行之前,globalVar
会被自动初始化为0。然后,在main
函数中,我们访问并修改了globalVar
的值,并打印出了修改前后的值。
通过这个实例,我们可以看到.bss段在程序中的作用:它提供了一个内存区域来存放未初始化的全局变量,并在程序开始执行之前自动将它们初始化为0。这样,即使这些变量在程序的二进制文件中没有占用空间来存储它们的初始值,程序在运行时仍然能够正确地访问和修改它们。