gpt4 book ai didi

c - C 中多处定义的全局符号的内存分配

转载 作者:行者123 更新时间:2023-11-30 16:30:35 25 4
gpt4 key购买 nike

对于共享相同名称的全局定义,我们是否为每个定义分配内存?链接器会影响我们为这些全局符号分配内存的方式吗?

以下是我认为解决此问题的可能方法:

1.我们首先为程序中遇到的全局变量分配内存。 (每个定义都会有内存。)然后链接器解析全局符号。

2.链接器解析多处定义的同名全局符号后,我们只为一个定义分配内存。

其中一个正确吗?

示例:

b.c

#include <stdio.h>
#include "a.c"
void f(void);
int x = 15213;
int main()
{
f();
printf("x = %d\n", x);
return 0;
}

交流

#include <stdio.h>
int x;
void f()
{
printf("x in f = %d\n", x);
x = 15212;
}

上面的代码编译并运行,没有任何错误或警告。这是我得到的:

x in f = 0
x = 15212

内存中是否有一个或两个 x 定义?

与此相关的一个简单问题:

全局变量和静态变量在初始化时存储在数据段(DS)中,在未初始化时存储在符号开始 block (BSS)中。即使BSS中的数据未初始化,它们也将始终被设置为默认值而不是垃圾值。这是正确的吗?

最佳答案

如果两个 .c 文件中的每一个都声明自己的全局 int x 作为示例,则会分配内存中的两个不同变量。

请注意,它们位于不同的作用域中,因此无法从其他文件访问这些符号。也就是说,每个文件总是通过全局变量名“x”访问自己的int x。

如果您尝试将全局变量extern到任何存在同名全局变量的源文件,您的编译器应该会报错。

关于c - C 中多处定义的全局符号的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51054308/

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