我正在浏览某人的代码,在那里我遇到了一个帖子:
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的想法是错误的还是编译器已经做了一些优化? (我认为自己是个好编码员,但这些事情迫使我再次思考,再次阅读丹尼斯·里奇)
答案 0 :(得分:5)
infobj
在while循环的每次迭代结束时被销毁,因此堆栈没有溢出,并且您一次又一次地获得相同的地址。是否可以在堆栈上分配int arr[1000000]
取决于每个线程允许的最大堆栈大小。在VC编译器上,这是1 MB,但可以通过编译器选项进行更改。
答案 1 :(得分:4)
不会发生堆栈溢出。堆栈分配的变量将仅在循环迭代的持续时间内存在,并且在其占用的堆栈空间之后可以重用。通常,当下一次迭代开始时,新迭代中的变量将使用相同的空间。
在相同函数的深度递归链调用的情况下可能发生堆栈溢出,因为当新调用将启动时,前一次调用范围内的所有变量都需要保留,因此sapce不会被重用,但是每次新呼叫都会使用更多的堆栈空间。在这个问题中并非如此。