0

C语言变量名存储在内存的哪个部分?例如 Var_Name 是变量名。我想知道这个 Var_Name 存储在内存部分的什么位置(代码、数据段等)

4

5 回答 5

12

它没有存储在任何地方。变量名只是编译器的标签,在二进制代码中没有任何意义,因此它们被省略并由相关的内存地址/寄存器替换。

于 2013-09-10T07:12:48.383 回答
6

变量名称往往不会存储在内存映像中的任何位置。如果您启用了调试,这些名称可能存在于可执行文件中,但它们对于代码运行并不是真正必要的,因此它们几乎总是不加载到进程内存中。

在代码需要运行的地方,变量名已被变量地址(绝对地址,或相对于某个已知位置,或相对于堆栈)替换。

它们可能会为不同的进程加载到内存中,例如,如果您正在使用调试器,但这不会使被调试的应用程序可以访问它们。

于 2013-09-10T07:13:43.887 回答
2

答案取决于您的目标文件格式。在大多数情况下,名称会被丢弃。一个值得注意的例外是符号被导出,如在共享库或 DLL 中。

于 2013-09-10T07:14:00.197 回答
1

C 中没有存储变量名。当你创建一个 C 文件并编译它们时,它主要经历 4 个阶段(预处理、编译、汇编、链接)。当您执行可执行文件时,这些阶段实质上会将您的代码转换为机器可以理解的语言。这些阶段用机器理解的地址替换你的名字。

于 2013-09-10T07:27:21.163 回答
0

在 C 的情况下,这些名称被称为“标识符”,它们在标准中被提及(正如它们的名称所说,用于识别代码中的变量)。

您的编译器需要代码中的标识符来获取您正在处理哪个变量的引用。但是编译后只有汇编代码(到目前为止你还没有处于调试模式)。这个所谓的对象文件只包含简单地说的值(作为整数值、指令或函数)和地址,与指令交互。

所以编译后就不再需要标识符了。如果用户没有明确需要它们,至少不会。(如前所述,调试模式会是什么情况。

于 2013-09-10T07:20:07.600 回答