【问题标题】:where are static buffers allocated?静态缓冲区分配在哪里?
【发布时间】:2012-12-24 12:53:14
【问题描述】:

假设我有一个文件 test.c,其中包含:

char buffer1[1024];

int somefunction()
{
      char buffer2[1024];
      // do stuff
}

现在我知道 buffer2 是在属于某些函数调用的帧上的堆栈上分配的,但是 buffer1 分配在哪里?

【问题讨论】:

  • 我错过了第 1 行的开头,还是 buffer1 真的不是静态分配的?
  • @H2CO3 任何既不是自动分配(通常在堆栈上)也不是动态分配(通过 malloc 等)的内存空间都是静态分配的。 static 关键字对于静态分配不是必需的,它是编译器指示文件范围的关键(当与此问题的 buffer1 案例中的程序全局声明一起使用时)。
  • @mah 与 C11 还有线程存储持续时间。
  • @effeffe 线程本地存储只是动态分配的一种特殊形式(因为任务控制块是在创建线程时动态分配的,并且 TLS 与它们相关联)。没有?
  • @mah 我不知道它是如何工作的,但我认为你是对的,因为线程必须有某种动态分配。但是由于它们的生命周期与静态数据不同,并且它们不能在程序开始时进行初始化,所以我指出了这一点。

标签: c static


【解决方案1】:

这些变量通常位于BSS(在源代码中没有显式初始化的变量,因此默认情况下它们的值为0)或data segment(初始化数据)。这里buffer1是未初始化的,所以它很可能会分配在BSS段上,从数据段的末尾开始。

来自bravegnu网站:

【讨论】:

    【解决方案2】:

    buffer1 在程序的静态(bss/data)内存部分中保留了内存。这就是所有静态变量和全局变量存在的地方。

    它是第三个内存段,就像栈和堆一样。

    【讨论】:

      【解决方案3】:

      静态声明的数组与本地声明的数组具有不同的存储规范。正如您所说,本地数组buffer2 将(通常)在堆栈上创建,而静态数组buffer1 将(通常)在./bss./data 段上创建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2014-06-26
        • 2018-12-06
        • 1970-01-01
        • 2011-03-23
        • 2018-10-02
        • 1970-01-01
        相关资源
        最近更新 更多