初始化数据段(.data):通常也称为数据段,它包含程序中明确给定初值的全局变量和静态变量。初始化数据段在编译的时候确定该段的大小,在程序运行的过程中该段的大小不能发生改变。
非初始化数据段(.bss):存储在这个段中的数据,通常是没有明确给定初值的全局变量和静态变量。这个段的内容往往不存储在外存上,而是在程序运行的时候由内核将段中的数据初始化为0或者NULL(对于指针变量而言)。
示例:bss段对程序目标文件大小的影响
bss1.c
#include <stdio.h>
int a[30];
int main()
{
printf("hello world/n");
return 0;
}
bss2.c
#include <stdio.h>
//int a[30];
int main()
{
printf("hello world/n");
return 0;
}
bss3.c
#include <stdio.h>
int a[30]={10,...10};
int main()
{
printf("hello world/n");
return 0;
}
bss4.c
#include <stdio.h>
int a[30]={0,...0};
int main()
{
printf("hello world/n");
return 0;
}
在红帽和CentOS下分别测试:
-rwxrwxrwx 1 root root 4698 Jul 20 2009 bss1
-rwxrwxrwx 1 root root 4668 Jul 20 2009 bss2
-rwxrwxrwx 1 root root 4838 Jul 20 2009 bss3
-rwxrwxrwx 1 root root 4838 Jul 20 2009 bss4
-rwxrwxrwx 1 root root 11582 7月 20 15:22 bss1
-rwxrwxrwx 1 root root 11548 7月 20 15:19 bss2
-rwxrwxrwx 1 root root 11718 7月 20 15:20 bss3
-rwxrwxrwx 1 root root 11718 7月 20 15:21 bss4
bss1 与bss2相差的字节数是系统用于标记未初始化变量的大小、属性等信息开销。