c - 无限递归 main() 中出现段错误后的不同运行时间

标签 c linux segmentation-fault stack-overflow

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

P.S2:我必须改变print进入printf并添加#include <stdio.h> .

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

关于c - 无限递归 main() 中出现段错误后的不同运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17270605/

相关文章:

c++ - 生产者/消费者模型中的段错误

检查 mmap 的地址是否正确

C++ EasyBMP 指针问题

c - C语言递归函数的几个问题

c - 尝试让 GetPrimaryMACAddress 停止打印详细信息

c - C 中对二维数组求和的函数

linux - 使用 ls 递归打印完整目录树的 Shell 脚本

linux - 在 bash shell 中使用 scp 时出现段错误(核心已转储)

linux - 为什么可执行文件不接收 Makefile 中导出的变量?

c - 什么决定了可以分配多少内存?