gpt4 book ai didi

c - 静态变量存储

转载 作者:行者123 更新时间:2023-12-04 09:27:19 24 4
gpt4 key购买 nike

在C语言中,静态变量存放在内存的什么地方?假设有两个静态变量,一个是函数局部变量,另一个是全局变量。该条目如何在符号表中维护?请解释。

最佳答案

C 中,它们可以存储在实现认为合适的任何地方。 C 标准不规定实现如何做事,只规定它的行为方式。

通常,所有静态存储持续时间变量(函数内的静态变量和函数外的所有变量)都将存储在同一区域中,无论它们是在文件级别还是在函数内。

上面括号中的那一点很重要。在函数之外,static 不会像在函数内那样决定变量的存储持续时间。它决定变量在当前翻译单元之外是否可见。 所有函数外的变量都是静态存储期。

而且,关于符号表,这是一个仅在构建过程中存在的结构。一旦生成可执行文件,就没有符号(当然排除调试信息,但这与代码的执行无关)。此时对变量的所有引用几乎肯定是硬编码地址或偏移量。

换句话说,是编译器确定您使用名称引用的变量。


您可以在此处查看有关如何存储变量的示例。考虑下面的小 C 程序:

#include <stdio.h>
int var1;
static int var2;
int main (void) {
int var3;
static int var4;

var1 = 111;
var2 = 222;
var3 = 333;
var4 = 444;

return 0;
}

这会生成以下程序集:

.file             "qq.c"
.comm var1,4,4
.local var2
.comm var2,4,4
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $111, var1
movl $222, var2
movl $333, -4(%ebp)
movl $444, var4.1705
movl $0, %eax
leave
ret
.size main, .-main
.local var4.1705
.comm var4.1705,4,4
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits

你可以看到 var1, var2var4 (静态存储持续时间的)都有一个 .comm 行将它们标记为公共(public)条目,由链接器合并。

此外,var2var3var4(在当前转译单元外不可见的)都有一个 .local 行,以便链接器不会使用它们来满足其他目标文件中未解析的外部。

并且,通过在链接文件时检查 ld --verbose 的输出,您可以看到所有公共(public)条目最终都在 .bss 区域中:

  .bss            :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
: : :
}

关于c - 静态变量存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com