在C的内存布局的每一段中,哪个数据结构?

在C的内存布局的每一段中,哪个数据结构?,c,memory-management,C,Memory Management,我知道C程序的内存布局分为文本、堆、堆栈、数据和bss段。我认为(不确定)这种内存布局本身就是维护不同存储类变量的作用域和生存期的原因 例如,自动变量存储在堆栈中。每次函数调用时,都会创建一个新的堆栈框架,该框架限制对被调用函数的自动变量的访问。但是它们仍然在相关的框架内,一旦被调用的函数返回控件,它们就开始工作 因此,我们可以证明自动变量的范围和寿命。但是,我想知道在其他段(即数据、bss和堆)中使用了哪些数据结构来维护这种范围。或者是控制作用域和生存期的内存布局之外的其他东西?看起来,你混淆

我知道C程序的内存布局分为文本、堆、堆栈、数据和bss段。我认为(不确定)这种内存布局本身就是维护不同存储类变量的作用域和生存期的原因

例如,自动变量存储在堆栈中。每次函数调用时,都会创建一个新的堆栈框架,该框架限制对被调用函数的自动变量的访问。但是它们仍然在相关的框架内,一旦被调用的函数返回控件,它们就开始工作


因此,我们可以证明自动变量的范围和寿命。但是,我想知道在其他段(即数据、bss和堆)中使用了哪些数据结构来维护这种范围。或者是控制作用域和生存期的内存布局之外的其他东西?

看起来,你混淆了因果关系。变量的范围和生存期由语言标准决定。实施必须确保符合标准。它可能会使用一些在特定平台上很方便的内存布局,但没有必要这样做


以文本或bbs为段的内存布局基本上是执行格式的问题,而不是语言的问题

也就是说,我们可以回答最常见的情况:在其他“段”中没有范围或生命周期的控制。数据和bss(分别用于初始化和未初始化的全局/静态变量)是在进程期间进行的,堆通过
malloc
free
进行显式管理(直到进程终止时整个堆被销毁)


我不知道“Viz”,所以我不能回答这个问题。

将一些标准强制语义与特定实现的细节混淆是一个潜在的陷阱。你能澄清一下你的问题吗?你到底想理解什么?要详细说明@Carl所说的话,请引用这句话:“自动变量存储在堆栈中。”好吧,是的,也许不是。在我所知道的所有实现中,具有自动存储持续时间的变量都是在堆栈结构上分配的。然而,C语言没有提到堆栈。它们可以通过其他方式实现,堆栈恰好是一个好的堆栈。“或者是控制作用域和生存期的内存布局以外的其他东西?”编译器可能会在自动变量的作用域结束后嵌入调用以销毁自动变量,以符合标准。但对我们来说,我们可以保证范围在标准规定的时间和地点结束。@CarlNorum我想知道bss和数据段中用于存储和检索数据的数据结构。我想知道是否有可能像在auto和register变量的情况下那样证明作用域的合理性。@EdS。那么,这是否意味着实际的实现不需要像auto那样应该使用堆栈段和静态bss、数据。。。等等,即。是一个拉丁语缩写词,意思大致明确。