我想问一下C变量是如何存储在C中的?
要更清楚地考虑以下代码:
int main() { int a = 1, b; b = a + 2; return 0; }
例如,在这里,存储器C存储可变位置的名称.
例如,如果&a=0x12A7
(假设)&b=0x123B1
,那么c如何以及在何处存储变量名称,例如存储内存名称a
?
变量名称根本不需要存储!编译器可以完全摆脱它们.想象一下,如果编译器非常聪明,它可以将整个程序减少到:
int main(){ return 0; }
请注意,此程序的效果与原始程序完全相同,现在根本没有变量!现在不需要给它们命名,是吗?
即使代码中的变量实际被使用,在编写程序时它们的名称纯粹是一种方便的表示法,但在执行代码时处理器不需要它们.就微处理器而言,这样的功能如下:
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
选项以发出"符号表",其中包含用于调试的变量名称等内容.但是不需要简单地运行一个程序,并且它没有被语言标准所涵盖 - 它是一个实现功能,它因平台而异.
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; }
可能至少包含以下符号: