据我们所知, 在Linux世界中,用户空间中无限递归的“main()”会收到“段错误”消息,这实际上是由堆栈溢出引起的。 (如下面的代码)
#include <stdio.h>
void main(void)
{
main ();
}
实验和问题:
将代码更改为:
#include <stdio.h>
int cnt = 0;
void main(void) {
printf("cnt %d\n", cnt++);
main();
}
测试环境:
x86-64 ubuntu, gcc-4.6
我需要您的帮助并提前致谢!
为什么不同的“cnt”值会出现段错误:
cnt:523614
cnt:523602
cnt:523712
cnt:523671
最佳答案
这可能是由于 Address space layout randomization 。如果您运行稍微修改过的程序示例:
#include <stdio.h>
int cnt = 0;
void main(void)
{
int a;
printf("cnt %d %p\n", cnt++, (void*)&a); fflush(stdout);
main();
}
你会看到a
的地址在程序的各种运行中并不一致。堆栈的初始大小可能也稍微随机化,导致适合此空间的堆栈帧数量略有不同。
P.S:我添加了 fflush
因此程序的输出可以安全地通过管道传输,例如 tail
和grep
,否则缓冲可能会模糊实际的最后一行输出。
P.S2:我必须改变print
进入printf
并添加#include <stdio.h>
.
P.S3:您不应该对程序使用优化,因为否则尾部调用优化将删除您的递归,并且您的程序实际上将永远循环。我的程序版本没有这样做,因为别名 a
.
关于c - 无限递归 main() 中出现段错误后的不同运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17270605/