用于所有分配变量名称的空间

Tus*_*wal 1 c variables

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

int i = 10;
Run Code Online (Sandbox Code Playgroud)

我无法找到名称" i"存储在内存中的位置.

Bri*_*ain 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           **** }
Run Code Online (Sandbox Code Playgroud)

在列表的后面我们可以看到调试符号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
Run Code Online (Sandbox Code Playgroud)