我无法得到一件事:当我在函数中声明变量(局部变量)时,它们被分配到堆栈上。引用是如何发生的?如果要将另一个值赋值给局部变量,是否需要知道变量在堆栈上的确切位置?这段信息存储在任何地方吗?
发布于 2015-03-25 06:17:41
假设您的代码如下所示:
void main() {
int a,b;
a = 5;
b = 7;
printf("%p\n", &a);
}这段代码应该在堆栈上分配两个int,'a‘和'b’。然后它将打印出'a‘的地址并退出。调用main时,堆栈将非常空。一些编译器生成的代码将在堆栈上分配一点空间,这样看起来如下所示:
- 'a': Random data
- 'b': Random data当您说'a = 5;‘时,您只是告诉编译器生成一些代码,这些代码将“将数字5放入我们称为’a‘的内存位置”。这个内存位置'a‘恰好位于堆栈上,所以编译器将5放入堆栈上的那个位置。
“b”也是一样的:
当我们得到对'a‘的引用时,我们得到堆栈上的地址,因为编译器决定在那里存储'a’。如果'a‘是一个全局变量,地址就不会在堆栈上。
不过,并不是说你需要关心。编译器应该为您处理所有这些东西。这就是C编译器的伟大之处,也是我们使用它们的原因。C编译器可以将任何变量放在任何它想要的地方,而您不需要在意。您只需说“在我们称为‘a’的位置放置5”(a =5)或“打印出您放置‘a’的地址”(printf("%p\n",&a;))。
简而言之,函数变量是在堆栈上分配的。您不需要知道堆栈上的位置才能设置它们,也不需要关心它们在哪里,因为编译器就是这样做的。
发布于 2015-03-25 06:05:11
您不必关心变量在堆栈中的位置。在编译代码时,编译器将处理这些有关变量将存储在哪里以及如何引用变量的问题。
https://stackoverflow.com/questions/29248416
复制相似问题