在for循环中声明变量

时间:2011-09-20 05:08:48

标签: c loops for-loop declaration

我正在尝试以下C代码:

void main()
{
   int i;
   for(i = 0; i< 10; i++)
   { 
      int num;
      printf("\nthe variable address is: %p", &num);

   }
   getch();
}

我原以为它要么抛出错误要么多次声明num,而是对于for循环的所有迭代,输出显示&num的相同值。 这种行为背后的原因是什么?似乎无论在for循环中都有声明,实际的声明/定义只发生一次。

有人可以帮我理解这种行为吗?

2 个答案:

答案 0 :(得分:7)

您正在打印堆栈分配变量的地址。变量的范围是for循环。从理论上讲,变量是在行int num;处创建的,其内存在关闭时释放。内存布局严格依赖于编译器。

可能是您的编译器足够聪明,知道它可以重用该内存,或者可能是内存是免费的,并且由编译器为您的变量存储选择。

也可能是优化器告诉编译器可以重用num

这完全取决于编译器,但是,因为它具有相同的地址并不意味着它只被声明/定义一次。

答案 1 :(得分:3)

为了帮助说明这一点,请比较一下:

   int i;
   int val = 0;
   for(i = 0; i< 5; i++)
   { 
      int num = val++;
      printf("\nthe variable address is: %p", &num);
      printf("\nthe value is: %d", num);
   }

这再次表明num始终具有相同的地址,但每次迭代时都会使用不同的值进行初始化。

堆栈的想法是它的布局是在编译时定义的;每个堆栈变量映射到堆栈帧上的地址。

另一个让你得到这个的事情是考虑到如果每次迭代“分配”一个新变量,小型机器如何处理一个大循环呢?

请参阅:Call Stack