gpt4 book ai didi

c - c如何处理不同范围内的相同变量名?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:14 25 4
gpt4 key购买 nike

我有以下代码

int main()
{
static int x = 8;
{
static int x = 9;
}
printf("%d",x);
}

o/p-8

我的疑问是,根据规则,静态变量只创建一次并保留在内存中。因此,如果名称为 x 的变量保留在内存中,那么我如何才能创建一个新变量。

请消除我的疑虑。我通过谷歌进行了搜索,但它是如何完成的,我在 C 编程中想要什么。编译器如何识别这两个变量以及它如何存储在内存中。

T

最佳答案

objdump 的反汇编输出可能会给您一些关于编译器(gcc,在本例中)如何处理这种情况的提示:

$ objdump -d a.out
...
000000000040050c <main>:
40050c: 55 push %rbp
40050d: 48 89 e5 mov %rsp,%rbp
400510: 8b 05 fa 03 20 00 mov 0x2003fa(%rip),%eax # 600910 <x.2163>
400516: 89 c6 mov %eax,%esi
400518: bf fc 05 40 00 mov $0x4005fc,%edi
40051d: b8 00 00 00 00 mov $0x0,%eax
400522: e8 b9 fe ff ff callq 4003e0 <printf@plt>
400527: 8b 05 e7 03 20 00 mov 0x2003e7(%rip),%eax # 600914 <x.2162>
40052d: 89 c6 mov %eax,%esi
40052f: bf fc 05 40 00 mov $0x4005fc,%edi
400534: b8 00 00 00 00 mov $0x0,%eax
400539: e8 a2 fe ff ff callq 4003e0 <printf@plt>
40053e: b8 00 00 00 00 mov $0x0,%eax
400543: 5d pop %rbp
400544: c3 retq

使用readelf,我们可以发现每个x在最终的可执行文件中都有自己的符号:

$ readelf -s a.out
...
45: 0000000000600910 4 OBJECT LOCAL DEFAULT 25 x.2163
46: 0000000000600914 4 OBJECT LOCAL DEFAULT 25 x.2162

这是 C 代码:

int main()
{
static int x = 8;
{
static int x = 9;
printf("%d",x);
}
printf("%d",x);
return 0;
}

关于c - c如何处理不同范围内的相同变量名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22067562/

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