我正在尝试以下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循环中都有声明,实际的声明/定义只发生一次。
有人可以帮我理解这种行为吗?
答案 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