.bss段的一个疑问
今天在看程序员的自我修养--编译、链接与库这根本输的时候,在第59页,讲.bss段的时候说了这样一个观点。说初始化的全部变量和局部变量存在.bss段中,并且在运行的时候,这些内容却是占据内存空间,并且可执行文件必须记录所有的未初始化的全部变量和局部静态变量的大小总和,记为.bss段。所以.bss段只是为未初始化的全局便利那个和局部静态变量预留位置而已,并没有内容,在文件中也不占空间。
这句话的意思是说.bss段中记录的内容其实只是为初始化的全局变量和静态局部变量的大小,但是并没有在.bss段中预留存放他们的地方所以不占空间的意思么?是这么理解的么?
Answers
有人翻译过国外牛人写的一篇文章,我在这里摘选一段吧:
先看Linux下的内存布局:
在C语言中,BSS和数据段保存的都是静态(全局)变量的内容。
区别在于BSS保存的是未被初始化的静态变量内容,它们的值不是直接在程序的源代码中设定的。BSS内存区域是匿名的:它不映射到任何文件。如果你写static int cntActiveUsers,则cntActiveUsers的内容就会保存在BSS中。
另一方面,数据段保存在源代码中已经初始化了的静态变量内容。这个内存区域不是匿名的。
它映射了一部分的程序二进制镜像(硬盘里),也就是源代码中指定了初始值的静态变量
。
所以,如果你写static int cntWorkerBees = 10,则cntWorkerBees的内容就保存在数据段中了,而且初始值为10。尽管数据段映射了一个文件,但它是一个私有内存映射,这意味着更改此处的内存不会影响到被映射的文件。也必须如此,否则给全局变量赋值将会改动你硬盘上的二进制镜像,这是不可想象的。
下图中数据段的例子更加复杂,因为它用了一个指针。在此情况下,指针gonzo(4字节内存地址)本身的值保存在数据段中。而它所指向的实际字符串则不在这里。这个字符串保存在代码段中,代码段是只读的,保存了你全部的代码外加零零碎碎的东西,比如字符串字面值。
代码段将你的二进制文件也映射到了内存中,
但对此区域的写操作都会使你的程序收到段错误。
这有助于防范指针错误,虽然不像在C语言编程时就注意防范来得那么有效。下图展示了这些段以及我们例子中的变量:
奉献上原文地址:http://blog.csdn.net/drshenlei/article/details/4339110