-1

Just as we know, In Linux world, infinite recusive "main()" in userspace will receive "segmentation fault" messsage, which is actually caused by stack overflow. (just as the following code)

#include <stdio.h>
void main(void) 
{
    main ();
}

Experiment and Question:

Change code to:

#include <stdio.h>
int cnt = 0; 
void main(void) {
    printf("cnt %d\n", cnt++);
    main();
}

Test environment:

x86-64 ubuntu, gcc-4.6

I need your help and thanks in advance!

Why Segmentation fault happens in different "cnt" value:

cnt: 523614

cnt: 523602

cnt: 523712

cnt: 523671

4

1 回答 1

2

这可能是由于地址空间布局随机化。如果您运行稍微修改过的程序示例:

#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,因此程序的输出可以安全地通过管道传输,例如tailand grep,否则缓冲可能会模糊实际的最后一行输出。

P.S2:我不得不更改printprintf添加#include <stdio.h>.

P.S3:您不应该在您的程序上使用优化,因为否则尾调用优化将删除您的递归,您的程序实际上将永远循环。我的程序版本没有这样做,因为别名a.

于 2013-06-24T08:32:07.320 回答