我正在浏览某人的代码,在那里我遇到了一个帖子:
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的想法是错误的还是编译器已经做了一些优化?(我认为自己是个好编码员,但这些事情迫使我再次思考,再次阅读丹尼斯·里奇)
将infobj在while循环的每次迭代结束时被销毁,因此堆栈溢出没有,你一次又一次得到同样的地址.是否可以int arr[1000000]在堆栈上分配取决于每个线程允许的最大堆栈大小.在VC编译器上,这是1 MB,但可以通过编译器选项进行更改.
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |