【问题标题】:Why the SIGSEGV?为什么选择 SIGSEGV?
【发布时间】:2009-10-27 08:04:50
【问题描述】:

为什么这段代码会抛出SIGSEGV

int main()
{
    unsigned long toshuffle[9765625];

    unsigned long i;

    for (i=0; i< 1000; i++)
        toshuffle[i]= i;

    return 0;
}

指针将不胜感激。 (没有双关语的意思:))

【问题讨论】:

  • 拜托你所崇拜的任何神明的爱,请使用“int main(void)”或“int main(int c,char *v[])”这个标准已经流传了很久: -)
  • 我的错。在几乎通话的情况下,我确实遵循这一点。

标签: c segmentation-fault


【解决方案1】:

使用 malloc() 获得那么多内存。你溢出了堆栈。

unsigned long *toshuffle = malloc(9765625 * sizeof(unsigned long));

当然,当你完成它时,你需要 free() 它。

注意:在 C++ 中,您需要将指针转换为正确的类型。

【讨论】:

  • “栈溢出”,终于有人说了! :)))
  • 在 C++ 中你会做新的 long[9765625],并且不会为演员和 sizeof... :)
  • 如何让编译器在超过堆栈大小时报错。
  • @iamrohitbanga:在编译时,即编译器工作的地方,您不知道可用的堆栈大小。
  • @Amit 是对的,但比这更糟。编译器知道堆栈有多大,它只是生成指令。链接器确实知道堆栈大小,但不知道您的代码将如何使用它。这意味着您必须在运行时失败。
【解决方案2】:

可能是因为您无法在堆栈上分配 9765625 个 long(这个站点又叫什么?:))。请改用malloc()

【讨论】:

    【解决方案3】:

    来自manpage

    • RLIMIT_STACK

    进程堆栈的最大大小,以字节为单位。达到此限制后,将生成 SIGSEGV 信号。要处理此信号,进程必须使用备用信号堆栈 (sigaltstack(2))。

    【讨论】:

      猜你喜欢
      • 2020-01-09
      • 2017-11-16
      • 2018-07-28
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2015-05-13
      相关资源
      最近更新 更多