1

其实我刚开始学习C语言。我想知道变量名在 C 的内存中存储在哪里。考虑以下代码:

int i = 10;

我无法找到名称“ i”存储在内存中的位置。

4

4 回答 4

8

我尝试了很多知道我在内存中存储的位置

通常,它不会存储在可执行文件内存中的任何位置。

在程序链接 ^ 之前,字符串“ i”被丢弃,目标代码(对于这个特定的例子)减少到寄存器访问。

编译器知道i并将其与用于此代码的其他寄存器区分开来。

如果您想找到某种方法来访问此字符串,可以通过与程序一起存储的调试符号。不幸的是,获取这些数据不适合新手,也不是特别便携。

^ 实际上,仅当您显示的代码在本地范围内时,这才是正确的。在文件范围内,字符串i被保留用于链接,只有这样它才能被链接器丢弃。

这是我的编译器提供的第一个中间输出的示例。我冒昧地将您的陈述置于本地范围内。包含的行****是我让编译器包含的注释,以便将源代码与程序集关联起来很容易。汇编器不使用它们(编译的下一阶段)。 i已被间接访问所取代%rbp

   1:w.c           ****
   2:w.c           **** int main()
   3:w.c           **** {
   9                    .loc 1 3 0
  10                    .cfi_startproc
  11 0000 55            pushq   %rbp
  12                .LCFI0:
  13                    .cfi_def_cfa_offset 16
  14                    .cfi_offset 6, -16
  15 0001 4889E5        movq    %rsp, %rbp
  16                .LCFI1:
  17                    .cfi_def_cfa_register 6
   4:w.c           ****     int i = 10;
  18                    .loc 1 4 0
  19 0004 C745FC0A      movl    $10, -4(%rbp)
  19      000000
   5:w.c           ****
   6:w.c           ****     return 0;
  20                    .loc 1 6 0
  21 000b B8000000      movl    $0, %eax
  21      00
   7:w.c           **** }

在清单的后面,我们可以看到i.

  55 004e 5F000000      .long   0x5f
  56 0052 03            .uleb128 0x3
  57 0053 6900          .string "i"
  58 0055 01            .byte   0x1
  59 0056 04            .byte   0x4
  60 0057 5F000000      .long   0x5f
  61 005b 02            .byte   0x2
于 2013-07-24T13:40:15.863 回答
3

该名称甚至不存在于您完成的编译程序中。它只是源代码中的一个方便的功能,可以让人类阅读。你不会在编译后的二进制文件中的任何地方找到变量名——在那个阶段,它们已经被一个复杂的、纠缠不清的指针和数字网络所取代。

于 2013-07-24T13:44:10.660 回答
2

取决于行的写入位置。如果它在函数内部,那么变量将具有自动存储。这意味着它将在函数执行时存储在堆栈中。并且在函数退出时不存在。

如果它在“文件范围”中,它将具有静态存储。并且将在程序运行的整个过程中存在。

此外,正如弗拉德指出的那样。如果编译器检测到变量未使用或具有常量值,则可能会对其进行优化。在这种情况下,它根本不会占用任何空间。

请注意,我说的是变量本身。名称不与程序一起存储。本机代码不需要变量名来访问它,它只需要知道它所在的内存区域。

于 2013-07-24T13:35:43.027 回答
1

在本地语言中,变量名不占用任何空间。

于 2013-07-24T13:38:40.833 回答