在哪个区段?BSS, .DATA,其他)的可执行文件的静态变量存储,以便他们没有名称冲突? 例如:


foo.c:                         bar.c:
static int foo = 1;            static int foo = 10;
void fooTest() {               void barTest() {
  static int bar = 2;            static int bar = 20;
  foo++;                         foo++;
  bar++;                         bar++;
  printf("%d,%d", foo, bar);     printf("%d, %d", foo, bar);
}                              }

如果我编译这两个文件并将其链接到重复调用fooTest()和barTest的主程序,printf语句将独立递增。这是有意义的,因为foo和bar变量是翻译单元的局部变量。

但是存储分配在哪里呢?

需要明确的是,假设您有一个工具链,该工具链将以ELF格式输出文件。因此,我认为在可执行文件中必须为那些静态变量保留一些空间。 为了便于讨论,让我们假设我们使用GCC工具链。


当前回答

你已经知道要么它存储在bss(块开始的符号),也称为未初始化的数据段或初始化的数据段。

让我们举一个简单的例子

void main(void)
{
static int i;
}

上面的静态变量没有初始化,所以它进入未初始化的数据段(bss)。

void main(void)
{
static int i=10;
}

当然它初始化了10,所以它去初始化数据段。

其他回答

数据的存储位置取决于实现。

然而,静态的含义是“内部联动”。因此,该符号是编译单元(foo.c, bar.c)内部的,不能在编译单元外部引用。因此,不能有名称冲突。

静态数据的位置取决于它们是否为零初始化。零初始化的静态数据放入.BSS(由符号启动的块),非零初始化的数据放入.DATA

这是如何(容易理解):

好吧,这个问题有点太老了,但既然没有人指出任何有用的信息: 查看'mohit12379'的帖子,解释了在符号表中存储同名静态变量的方法: http://www.geekinterview.com/question_details/24745

你已经知道要么它存储在bss(块开始的符号),也称为未初始化的数据段或初始化的数据段。

让我们举一个简单的例子

void main(void)
{
static int i;
}

上面的静态变量没有初始化,所以它进入未初始化的数据段(bss)。

void main(void)
{
static int i=10;
}

当然它初始化了10,所以它去初始化数据段。