我无法得到一件事: 当我在函数内部声明变量(本地)时,它们被分配在堆栈上。 参考如何发生?如果我想为局部变量分配另一个值,我是否需要知道变量位于堆栈的确切位置?这条信息是否存储在任何地方?
答案 0 :(得分:3)
您不必关心堆栈上变量的位置。在编译代码时,编译器将负责处理变量存储位置以及如何引用变量。
答案 1 :(得分:2)
假设您的代码如下所示:
void main() {
int a,b;
a = 5;
b = 7;
printf("%p\n", &a);
}
此代码应在堆栈上分配两个整数“a”和“b”。然后它将打印出'a'的地址并退出。当调用main时,堆栈将非常空。一些编译器生成的代码将在堆栈上分配一些空间,因此它看起来像这样:
- 'a': Random data
- 'b': Random data
当你说'a = 5;'时,你只是告诉编译器生成一些代码,将“将数字5放在我们称之为'a'的内存位置”。这个内存位置'a'恰好位于堆栈中,因此编译器将5放入堆栈中的那个位置。
对于'b'来说几乎是一样的:
当我们得到'a'的引用时,我们得到一个堆栈上的地址,因为那是编译器决定存储'a'的地方。如果'a'是全局变量,则地址不会在堆栈中。
但是,并不是说你需要关心。编译器应该为您处理所有这些事情。这是C编译器的优点,这也是我们使用它们的原因。 C编译器可以将任何变量放在任何需要的位置,而您无需关心。您可以说“将5放在我们称之为'a'的位置”(a = 5;)或“打印出放置'a'的地址”(printf(“%p \ n”,& a) );)简而言之,函数变量在堆栈上分配。您不需要知道堆栈中的哪个位置可以设置它们,并且您不需要关心它们的位置,因为这就是编译器的用途。