C语言内存中是否存在一个区域,存储着变量的符号,变量的类型和变量的首地址?
C语言是一个复杂的体系。需要很长时间才能研究透彻,其实我觉得这种说法不完备,不应该说是某一个区域之类的。
通常不是这样,但是在编译时,将该内存作为某种应用程序使用。一种指针类型的变量,其内容是存储在运行时可以更改的内容的“第一个地址”。可怜的RTTI系统提供运行时类型标记。脚本语言确实保存了变量名称和函数名的列表,以及类型信息,它们的变量通常不是基本类型,函数也不是本机函数。
当然,有时调试方便,编译器将在编译时将变量符号的地址关系写到可执行文件。因此,如果出现错误,调试将是方便的。例如,当GCC编译时,- g参数是可以的。但即使是这样,也不一定所有的符号都会被记录下来,而且在编译过程中会优化一些变量,而你将无法找到它们。
对于一台计算机,它的世界没有变量,常数。他生活在一个简单的世界中,它知道存储空间、寄存器、内存等具有地址或可寻址的(可以找到),通过执行命令来操作数据。每天按顺序执行指令,指令通常会告诉它到某个地址数据移动,或将数据添加到减号、地址或更改当前执行的指令。
高级语言定义了变量、常量、结构,甚至对象。计算机不知道它们,但它似乎并不存在于计算机中,但它可能是内存空间或指令的一部分。为了让计算机理解高级语言的概念,编译器被发明来帮助翻译工作。
C语言标准不应该说编译的东西是什么,或者可以说,即使编译结果包含问题中的信息,也无法按照C语言标准获得这些信息。
一些想法
虽然一般的编译器一般不存储信息,但为了调试或性能分析,常常会将类似的信息(如调试符号)存储在可执行文件或其他调试文件中,这样您可以在调试器中看到与标识符值对应的信息。
在编译C / C++源代码,有没有这样的东西作为“变量名”或“变量”。一切都被转换为实际的地址(或/ EBP偏移到堆栈的顶部)。这个转换的步骤是在编译过程中完成的。当然,有时为了便于调试,编译器在编译时将变量符号的地址关系写入可执行文件。这样,如果有问题,调试会更方便。例如,当编译GCC时,g参数就可以了。然而,即使如此,并不是所有的符号都会被记录下来,一些变量在编译过程中会被优化,这是不可能找到的。
存储变量的符号
如果您使用GCC的G编译,它将带有符号符号的名称,但这通常是一个全局变量和一个全局函数。我不记得函数的内部或内部。
变量类型
在汇编语言或机器代码中编译程序之后,变量已经是处理器可以处理的类型。
严格地说,原始类型的信息大部分时间都丢失了。
例如,size_t,成为int,除非你能从该组件的代码,这是size_t。
变量的第一个地址
不是所有的变量都有第一个地址,对吧?
如果它是结构的一个成员,则由指针访问它,它将以地址的方式表示。
如果它是一个简单的类型变量,它可能直接包含在机器代码中,并且不再存在地址。
例如,int = 99;