其实我刚开始学习C语言。我想知道变量名在哪里存储在C的内存中。请考虑以下代码:
int i = 10;
我无法找到名称“i
”存储在内存中的位置。
答案 0 :(得分: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
答案 1 :(得分:3)
在已完成的已编译程序中,名称甚至不存在 。它只是源代码中的一个方便的功能,使人类可以读取它。你不会在任何地方的编译二进制文件中找到变量名称 - 在那个阶段,它们已被一个复杂的,纠缠不清的指针和数字网络所取代。
答案 2 :(得分:2)
取决于行的写入位置。如果它在函数内部,那么变量将具有自动存储。这意味着当函数执行时,它将存储在堆栈中。当函数退出时将不存在。
如果它在"文件范围"它将具有静态存储。并且在程序运行的整个过程中都会存在。
另外,弗拉德指出。如果编译器检测到它未使用或具有常量值,则可以优化掉变量。在这种情况下,它根本不会占用任何空间。
请注意,我自己在谈论变量。名称不会与程序一起存储。本机代码不需要变量名来访问它,它只需要知道它所在的内存区域。
答案 3 :(得分:1)
在本地语言中,变量名称不占用任何空间。