【问题标题】:Where the static variables are stored? [duplicate]静态变量存储在哪里? [复制]
【发布时间】:2015-11-03 05:19:00
【问题描述】:

根据参考资料,其中许多都被说成是存储在数据段中。这意味着如果我在另外两个函数中声明了相同的静态变量名,则数据段包含的不仅仅是同一变量的声明。如果是这样,碰撞发生与否?

因此,存储静态变量的位置。我认为它存储在文本段中。因此,只有在函数的每次迭代中,静态中的值 变量保持不变。如果它在数据段中,就会发生冲突。如果它在堆栈中,则变量的范围会扩展到函数的生命周期,因此它无法维护存储在变量中的值。对吗?

【问题讨论】:

  • 文本段存储程序代码。变量不能存储在文本段中,因为它们不是程序代码。 (cap.obvious)
  • 全局静态变量,还是局部静态变量?正如你所知道的,这取决于实现(编译器),而 C 规范没有说明这一点(或“段”之类的东西)。
  • 您的困惑源于您认为如果您在两个不同的函数中使用相同的名称,那么就会出现名称冲突。事实并非如此。没有这样的冲突。创建了两个不同的变量。克服这种误解,您的问题就会解决。
  • 编译器为每个全局静态变量的名称添加前缀,从而使其唯一。前缀通常来自声明变量的文件的名称(这就是为什么在头文件中声明此类变量时可能会出现链接错误 - 如果头文件包含在多个源文件中,则同一个全局变量将被多次声明)。
  • 避免你是否应该问这些问题。对于大多数编译器,初始化的静态变量存储在 .data 段中。如果您在全局或函数范围内未初始化(或初始化为 0)变量,它将被放置在 .bss 段中,并在运行时启动时设置为 0。

标签: c variables static


【解决方案1】:

静态变量存储在代码的数据段中。实际上,内存分为三个主要部分:

  • 文本、数据和堆栈/堆

文本段只存储代码编译后的实际可执行文件。因此,静态变量无法存储在文本段中。

堆栈和堆包含动态数据,即堆栈中为范围声明的变量(局部变量),堆中的全局/外部/未分配类型(也通过 malloc、calloc 等分配的内存)和每个函数的调用都会创建一个新堆栈。
这是许多递归代码由于堆栈溢出而导致分段错误的原因之一

现在,具有静态链接的变量(静态变量,只读数据和未初始化数据)除了内存的Data Segment外无处可去。现在可以有局部静态变量和全局静态变量。C总是更喜欢局部变量而不是全局变量名称相同,因此在 'c' 中不会发生名称冲突,除非在相同范围内声明具有相同名称的变量。

【讨论】:

    【解决方案2】:

    静态变量存储在内存中的 Datasegment 中。他们的生命周期是直到程序终止。但它们的作用域是声明它们的函数的本地范围。如果声明为全局,则它们的范围仅限于声明它们的文件。

    【讨论】:

    • 如果变量存储在数据段中,则可以从程序的任何位置访问变量,就像全局变量一样。是不是?那么,静态变量如何放置在数据段中,其作用域与函数有关。有可能吗?
    • @mohan 你为什么关心细分?听起来你对这一切如何运作的心智模型很遥远。你在错误的层面上考虑这个问题。至少暂时忘记细分。毕竟,该标准没有提及它们。专注于理解语言而不是一种特定的实现。
    • @DavidHeffernan 不是这样的。只是我想知道静态变量是如何像其他变量一样在内部存储的。例如:如果我想参加有关此的会议,我必须了解静态变量的 a 到 z。在那里,我无法说出这些类型的答案。我们并没有说没有标准实施的参考。我们寻找答案的方式是错误的。但是,在某个地方会有答案。我们想找到答案,直到我们得到答案。无论如何谢谢你的帮助....
    • 你的方法不对。知道它们的存储位置没有帮助。如果机器上的段的组织方式与您的机器不同,那该怎么办?先从高层次理解语言。
    • @mohan :我的朋友静态变量存储在数据段中,根据您的说法,它可以像全局变量一样从程序中的任何位置访问。我理解你的意思,但让我向你明确一点,静态变量的范围在使用它的模块内,但它的生命周期是整个程序的生命周期。
    【解决方案3】:

    变量的存储位置取决于变量的生命周期。静态变量的生命周期是整个程序的生命周期。所以静态变量和全局变量都存储在你内存的data segment 中。

    【讨论】:

      【解决方案4】:

      在初始化数据段中,一般也称为数据段。 数据段是程序虚拟地址空间的一部分,其中包含由程序员初始化的全局变量和static变量。

      【讨论】:

        猜你喜欢
        • 2011-12-12
        • 2018-08-14
        • 1970-01-01
        • 2021-03-18
        • 1970-01-01
        • 2012-01-13
        • 2010-09-10
        相关资源
        最近更新 更多