就像我们所知, 在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
答案 0 :(得分:2)
这可能是由于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
的地址在程序的各种运行中不一致。可能堆栈的初始大小也略有随机化,导致这个空间中的堆栈帧数量略有不同。
PS:我添加了fflush
,因此可以安全地通过例如tail
和grep
传输程序的输出,否则缓冲可能会模糊输出的实际最后一行
P.S2:我必须将print
更改为printf
并添加#include <stdio.h>
。
P.S3:您不应该对您的程序使用优化,否则尾部调用优化将删除您的递归,您的程序将实际循环。我的程序版本没有这样做,因为别名为a
。