我想问一下C变量是如何存储在C?
中的更清楚地考虑以下代码:
int main() {
int a = 1, b;
b = a + 2;
return 0;
}
例如,这里的内存C存储了变量位置的名称。
例如,如果&a=0x12A7
(假设)&b=0x123B1
,则c如何以及在何处存储变量名称,例如存储内存名称a
?
答案 0 :(得分:18)
根本不需要存储变量名称!编译器可以完全摆脱它们。想象一下,如果编译器非常聪明,它可以将整个程序减少到:
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
选项以发出“符号表”,其中包含用于调试的变量名称之类的内容。但是不需要简单地运行一个程序,而且它没有被语言标准所涵盖 - 它是一个实现功能,它因平台而异。
答案 1 :(得分:12)
C不存储变量的名称。它是在编译器的符号表中存储变量名称的编译器 此数据结构由编译器创建和维护 代码段的<{3}}符号表
// 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;
}
可能至少包含以下符号:
答案 2 :(得分:-1)
首先,如果你只是想与C在海峡上,那么这就是从哪里开始: http://condor.cc.ku.edu/~grobe/intro-to-C.shtml
但这比你的问题更实用。要回答这个问题,我们首先要问为什么变量有地址这里的原因是堆栈。对于要操作的程序,返回调用必须指向适当的缓冲区,以便所有部分按设计组合在一起。现在我认为是原始问题,即实际地址是如何决定的,对于答案,您必须了解处理器如何实现堆。
https://en.wikipedia.org/wiki/Memory_management
&#34;由于事先不知道分配的精确位置,因此通常通过指针引用间接访问存储器。用于组织内存区域以及分配和解除分配块的特定算法与内核相互关联...&#34;
这使我们回到实际的事物方面,抽象指针:
https://en.wikipedia.org/wiki/C_dynamic_memory_allocation
希望能让你更清楚地了解引擎盖下的内容:)
快乐的编码。