【问题标题】:Where are variables stored when you have "global" variables in multiple C files?当多个 C 文件中有“全局”变量时,变量存储在哪里?
【发布时间】:2021-11-14 13:03:38
【问题描述】:

当您有多个 C 文件时,比如 main.c 和 process.c,我试图了解两种情况下在函数之外声明的变量的存储位置。

// this is main.c
#include <stdio.h>
#include "process.h"
int foo = 1;

void main() {
   int count = get_counter();
}

// this is process.c
#include <stdio.h>

int counter = 0;

int get_counter() {
    return counter;
{

所以当你有两个c文件,你的main.c和一个process.c,你可以在中调用get_counter() em>main.c 它将返回 process.c 文件中的值。我想了解的是编译器在哪里,或者它如何将 int foo 存储在 main.cint countprocess .c?这是某些数据存储部分的一部分吗?它不在堆栈上吗?它似乎也有一个单独的 process.c 文件,因此它不是全局变量。

我一直在努力了解变量作用域是如何处理的,这对我来说可能有点棘手。 #include "process.h" 本质上是否像在其余代码上方的 main.c 中具有函数及其原型一样进行编译?对我来说,这会使 int 计数器 全局化,所以我知道我有些混淆了。

感谢您抽出宝贵时间阅读本文。

【问题讨论】:

  • 它存储在每个目标文件的 DATA 部分中。
  • 当链接器组合目标文件时,它会连接它们的所有数据部分,并修复变量引用以在其中的适当部分找到它们。
  • 为什么你认为它不是全局变量?每个源文件都有自己的一组全局变量。
  • 我使用的术语可能不正确。相对于 main.c,process.c 不是全局的。我需要 process.c 中的 get_counter() 来检索该参数。不确定代码如何分隔每个 c 代码都有自己的全局变量的数据段?
  • 由于process.c中的counter是全局的,所以在main.c中你可以作弊,说extern int counter;,然后直接说int count = counter;,而不使用访问器函数。要将counter 变量设为process.c 的私有变量,并禁止main.c 以这种方式作弊,您可以将其声明更改为static int counter;

标签: c variables scope compiler-construction


【解决方案1】:

这是可执行文件格式的功能,而不是 C 语言本身。对于ELF(*nix 和类似系统)和PE/COFF(Windows 和类似系统),具有static 存储持续时间的全局变量或其他对象将存储在.bss.data 部分中,具体取决于它们是否是否重新初始化。这是从程序的二进制映像本身分配的空间(不是从堆栈或堆中获取的)。

其他可执行文件格式可能使用不同的节名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多