【问题标题】:Stack Overflow and Segmentation Fault堆栈溢出和分段错误
【发布时间】:2011-10-30 03:30:15
【问题描述】:

在这种情况下,当无限递归运行时,堆栈溢出是否会导致分段错误。我期待一个像“堆栈溢出”这样的错误消息!

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

【问题讨论】:

  • 可能取决于平台。
  • Stackoverflow 确实在这里发生,但是在调试程序而不是运行程序时会收到此错误消息。
  • @Mr.TAMER:你能告诉我如何调试和查看堆栈溢出消息吗?
  • @user302520:每个 C++ 编译器都可以运行任何 C 代码,所以我使用 MS Visual C++ 来调试 C 代码。这只是一个正常的调试(例如F5)。

标签: c recursion stack-overflow runtime-error


【解决方案1】:

你只是在做一个 int 溢出。

达到他的最大值后,它会继续他的负值。

这个递归会破坏你的调用栈!

void lol()
{
lol();
}

这里是缓冲区溢出: https://www.owasp.org/index.php/Buffer_Overflow

这不是编程错误,而是一些安全问题。

就像你没有验证密码输入 len,然后那个人给你发送了 4000000 个字符,如果 len 声明为 char[6],这些字符将溢出你的 char*。

【讨论】:

  • 问题的代码示例中有明显的无限递归。 main() 在非尾部位置调用 main(),这将不可避免地填满堆栈。
  • 如果 int 在该平台上是 64 位,我非常怀疑它会在堆栈之前溢出...
  • @inflagranti,这取决于堆栈的大小以及它是否可以增长。某些平台允许您固定堆栈的大小。
  • @MSN:不过,这肯定是一个巨大的堆栈。就像 2^63 帧的堆栈一样 - 我希望看到(或者更确切地说拥有)可以填充该大小堆栈的机器......
  • @inflagranti,啊,我完全误读了你的评论。你的意思是堆栈溢出之前的整数溢出。
【解决方案2】:

堆栈溢出是一个原因;堆栈溢出的影响是(在许多情况下)分段错误。创建错误消息的代码是否能够从结果中推断出原因是堆栈溢出,这取决于操作系统、体系结构和运行时环境。但大多数人都懒得去尝试。

【讨论】:

    【解决方案3】:

    会导致分段错误,因为堆栈会溢出。

    每次对 main 的调用都会将更多数据推送到堆栈中,这样您的程序就知道从 returns 从 main() 跳转到哪里。最终,您将耗尽堆栈空间(堆栈溢出)。此时,您对main 的下一次调用将尝试将数据推送到堆栈。由于没有更多可用的堆栈空间,它会意外写入无效的内存位置,从而触发分段错误。这类似于你写到数组末尾之后。

    【讨论】:

      【解决方案4】:

      与之前发布的其他人一样,这取决于环境(操作系统、硬件、编译器等)。取决于此,错误消息可能无法反映实际原因(通常在进行无效内存访问时)。也就是说,在类似 valgrind 中运行它应该始终为您提供有关此类访问原因的可靠信息。

      【讨论】:

        猜你喜欢
        • 2012-05-21
        • 2011-02-10
        • 2010-09-10
        • 2020-01-07
        • 2014-01-26
        • 2019-02-16
        • 2011-09-10
        • 1970-01-01
        相关资源
        最近更新 更多