无Stackoverflow:循环中的自动对象

Ala*_*lam 1 c stack-overflow

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

while(TRUE)

{
 ......
 STRUCT_MSG_SYS_HEADER  sysHdr;
 .....
 ....
}
Run Code Online (Sandbox Code Playgroud)

这样有五个线程,我的观点是"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 }
Run Code Online (Sandbox Code Playgroud)

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

Nav*_*een 5

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