在c中,未初始化的静态变量和全局变量位于未初始化的数据段上。
所以在这段代码中
int var; //on the uninitialized data segement
int main(){
var = 5; //does this initialized global variable stay on the uninitialized data segement?
return 0;}var在未初始化的数据段上。如果稍后在运行时我给它一个值并定义它,会发生什么?
如果变量后来以某种方式移动到初始化的数据段,那么bss的用途是什么?
发布于 2020-11-30 08:05:10
未初始化的静态变量和全局变量中的
位于未初始化的数据段上。
这可能是对一个或多个特定C实现的正确描述,但是一般的“段”和特别的“未初始化的数据段”不是C语言的概念。
C的语义非常简单:程序的行为就好像在程序开始执行之前为所有文件作用域和所有静态变量分配了存储空间,并且在程序终止之前一直保持分配状态。也就是说,它们标识的对象具有“静态存储持续时间”。该语言没有指定这些(或任何其他)对象的存储位置,但在具有静态存储持续时间的对象的生存期内如何访问对象与在其(较短的)生存期内如何访问其他对象之间没有区别。
是否使用显式初始化器声明对象并不会考虑如何使用具有静态存储持续时间的对象。它只影响它们的初始值。
变量位于未初始化的数据段上。如果稍后在运行时我给它一个值并定义它,会发生什么?
你的困惑似乎是由于混合了多个层次而引起的。“未初始化的数据段”,在您看来是认真的,是可执行文件格式的一个特性,比如ELF。它在很大程度上与运行时程序内存中的对象布局无关。此外,“定义”标识符是一个源代码概念,而不是一个运行时概念。程序可以在运行时读写对象的值,但它不能做任何事情来影响是否定义标识符。
因此,答案是,如果您为一个具有静态存储持续时间的对象赋值,则该对象此后将保持赋值,直到且除非为其分配了不同的值,无论它是否使用显式初始值设定项声明。
如果变量后来以某种方式移动到初始化的数据段,那么bss有什么用?
同样,BSS和其他“段”是文件格式的方面,而不是程序的运行时内存。对于分配给ELF BSS段的非const变量,在运行时接收新值时,不需要进行任何特殊操作。C语言语义不提供将这样的对象或它们的运行时存储与其他对象及其存储区分开来的方法。特别是,为对象赋值永远不会导致该对象的地址发生变化。
使用BSS和类似机制是为了减少可执行文件在磁盘上的大小。将变量分配给BSS会建立其初始值,而不会在文件中显式记录该初始值。通常,BSS段在可执行文件中将占用零空间,因此您可以将其描述为“虚拟的”,但是当程序加载到内存中执行时,会为BSS内容分配实际的存储空间。
https://stackoverflow.com/questions/65065790
复制相似问题