当前位置: 技术问答>linux和unix
关于C程序存储空间布局的问题
来源: 互联网 发布时间:2016-12-14
本文导语: 想问下初始化数据段和非初始化数据段的区别。 比如: int a; int b = 10; int main() { ....... } 上面的变量a和b,是处于哪个数据段。 然后,我下面的理解是否正确: 初始化数据段中的数据是否可以理解成是C程序中...
想问下初始化数据段和非初始化数据段的区别。
比如:
上面的变量a和b,是处于哪个数据段。
然后,我下面的理解是否正确:
初始化数据段中的数据是否可以理解成是C程序中任何函数外的数据声明,该数据被显示的初始化过,如变量b;
非初始化数据段则是C程序中任何函数外的变量声明,该变量未被显示初始化,如变量a。
比如:
int a;
int b = 10;
int main()
{
.......
}
上面的变量a和b,是处于哪个数据段。
然后,我下面的理解是否正确:
初始化数据段中的数据是否可以理解成是C程序中任何函数外的数据声明,该数据被显示的初始化过,如变量b;
非初始化数据段则是C程序中任何函数外的变量声明,该变量未被显示初始化,如变量a。
|
楼主没有明白为什么有初始化数据段和未初始化数据段
未初始化段又称为BSS(Block Started by Symbol)段,用于存放未初始化的全局变量和静态变量,而初始化数据段存放初始化的全局变量和静态变量。
BSS段具体体现为一个占位符,不占用exe空间,其内容由操作系统初始化(清零),而data段需要占用,其内容由程序初始化。
BSS段之所以不占用exe文件空间是因为bss段都是一些没有初始化的变量,所以没有必要把这些变量的值给存储下来,只要记录下分配多大的空间就行了,到时候告诉loader需要分配多大的空间。
比如全局数据int a[100];这里没有初始化,所以没必要为他们分配100个int的空间,只需要告诉loader运行时候需要100个int的空间,这些空间的值都会被设置为缺省0
在Unix系统中,可以使用size a.out命令查看段大小。
未初始化段又称为BSS(Block Started by Symbol)段,用于存放未初始化的全局变量和静态变量,而初始化数据段存放初始化的全局变量和静态变量。
BSS段具体体现为一个占位符,不占用exe空间,其内容由操作系统初始化(清零),而data段需要占用,其内容由程序初始化。
BSS段之所以不占用exe文件空间是因为bss段都是一些没有初始化的变量,所以没有必要把这些变量的值给存储下来,只要记录下分配多大的空间就行了,到时候告诉loader需要分配多大的空间。
比如全局数据int a[100];这里没有初始化,所以没必要为他们分配100个int的空间,只需要告诉loader运行时候需要100个int的空间,这些空间的值都会被设置为缺省0
在Unix系统中,可以使用size a.out命令查看段大小。