无Stackoverflow:循环中的自动对象

时间:2010-08-20 05:33:38

标签: c stack-overflow

我正在浏览某人的代码,在那里我遇到了一个帖子:

while(TRUE)

{
 ......
 STRUCT_MSG_SYS_HEADER  sysHdr;
 .....
 ....
}

这样有五个线程,我的观点是“STRUCT_MSG_SYS_HEADER sysHdr;”在一段时间或几天之后会导致stackoverflow ...(虽然没有测试)。所以我决定编写一个简单的示例应用程序

  1 #include "stdio.h"
  2
  3 struct infinite
  4 {
  5     int arr[1000000];
  6 }infinite;
  7
  8 int main()
  9 {
 10     while(1)
 11     {
 12         struct infinite infobj;
 13         printf("\ninfinite = %x\n", &infobj);
 14     }
 15     return 0;
 16 }

但是在这里它为infobj打印相同的地址。我对stackoverflow的想法是错误的还是编译器已经做了一些优化? (我认为自己是个好编码员,但这些事情迫使我再次思考,再次阅读丹尼斯·里奇)

2 个答案:

答案 0 :(得分:5)

infobj在while循环的每次迭代结束时被销毁,因此堆栈没有溢出,并且您一次又一次地获得相同的地址。是否可以在堆栈上分配int arr[1000000]取决于每个线程允许的最大堆栈大小。在VC编译器上,这是1 MB,但可以通过编译器选项进行更改。

答案 1 :(得分:4)

不会发生堆栈溢出。堆栈分配的变量将仅在循环迭代的持续时间内存在,并且在其占用的堆栈空间之后可以重用。通常,当下一次迭代开始时,新迭代中的变量将使用相同的空间。

在相同函数的深度递归链调用的情况下可能发生堆栈溢出,因为当新调用将启动时,前一次调用范围内的所有变量都需要保留,因此sapce不会被重用,但是每次新呼叫都会使用更多的堆栈空间。在这个问题中并非如此。