变量名如何存储在C中?
我想问一下C变量是如何存储在C中的?
为了更清楚,请考虑以下代码:
int main() { int a = 1, b; b = a + 2; return 0; }
例如,这里存储器C存储可变位置的名称。
例如,如果&a=0x12A7
(假设) &b=0x123B1
,那么c如何以及在何处存储变量名称,例如存储内存名称a
?
C不存储变量的名称。 它是在编译器的符号表中存储变量名称的编译器。
此数据结构由编译器创建和维护。
代码段的符号表示例
// Declare an external function extern double bar(double x); // Define a public function double foo(int count) { double sum = 0.0; // Sum all the values bar(1) to bar(count) for (int i = 1; i <= count; i++) sum += bar((double) i); return sum; }
可能至少包含以下符号:
变量名称根本不需要存储! 编译器可以完全摆脱它们。 想象一下,如果编译器非常聪明,它可以将整个程序减少到:
int main(){ return 0; }
请注意,此程序的效果与原始程序完全相同,现在根本没有变量! 现在不需要命名,是吗?
即使代码中的变量实际被使用,在编写程序时它们的名称纯粹是一种方便的表示法,但在执行代码时处理器不需要它们。 就微处理器而言,这样的function如下:
int foo(int x, int y) { int z = x + y; return z * 2; }
在一些假设的简单指令集架构(ISA)中,可能导致编译代码执行此操作:
ADD # consumes top two values on stack (x and y), pushes result (z) PUSH 2 # pushes 2 on stack MULT # consumes top two values on stack (z and 2), pushes result RET
较长的故事是有时存储变量名称以用于调试目的。 例如,如果您正在使用GCC,则可以传递-g
选项以发出“符号表”,其中包含用于调试的变量名称之类的内容。 但是不需要简单地运行一个程序,并且语言标准没有涵盖它 – 它是一个实现function,它因平台而异。
好吧首先,如果你刚刚开始使用C,这是从哪里开始: http : //condor.cc.ku.edu/~grobe/intro-to-C.shtml
但这比你的问题更实际。 要回答这个问题,我们首先要问为什么变量有地址 这里的原因是堆栈。 对于要操作的程序,必须将返回调用定向到适当的缓冲区,以便所有部分按设计方式组合在一起。 现在我认为是原始问题,即实际地址是如何决定的,对于答案,您必须了解处理器如何实现堆。
https://en.wikipedia.org/wiki/Memory_management
“由于事先不知道分配的精确位置,因此通常通过指针引用间接访问内存。用于组织内存区域以及分配和释放块的特定算法与内核相互关联……”
这让我们回到了指针抽象的实际方面:
https://en.wikipedia.org/wiki/C_dynamic_memory_allocation
希望tis让你更清楚地了解引擎盖下的内容:)
快乐的编码。