【问题标题】:Why do I get a segfault in C from declaring a large array on the stack?为什么我在 C 中通过在堆栈上声明一个大数组而得到一个段错误?
【发布时间】:2011-03-09 19:38:16
【问题描述】:

我从这行代码中得到一个段错误:

int fatblob[1820][286][5];

这是为什么呢?

【问题讨论】:

标签: c stack


【解决方案1】:
int fatblob[1820][286][5];

您正在尝试分配大约 9.8 MB 的 180*286*5*4(让 int 大小 = 4)的内存位置,因此您的操作系统上的默认堆栈大小可能会更小。

LINUX 有 8192 KB(即 8 MB)的堆栈大小。所以很明显,如果您尝试在堆栈上分配更多内存,您将遇到堆栈溢出。

您可以尝试更改操作系统的堆栈大小。 在 LINUX 中你可以试试 ulimit

ulimit -s

喜欢

$ ulimit -s 1024

希望对你有帮助。

【讨论】:

    【解决方案2】:

    因为你的堆栈段小于1820*285*5ints。它通常在 1MB 左右。

    【讨论】:

    • * sizeof(int),在健全的 32 位系统上超过 9MB。
    【解决方案3】:

    C 中的自动变量(默认类型)通常分配在堆栈上。堆栈是为每个线程分配的内存区域,虽然它在许多操作系统上可能会增长,但它的大小总是有限的。 danben's answer 很好地涵盖了默认堆栈,但如果您使用线程,则在线程创建中分配新的堆栈(例如 pthread_attr_setstacksize)。一般来说,大的分配最好在堆上完成(malloc/new),但有时即使这样也可能太小了。 mmap() 或类似的东西有时会有所帮助。

    丹本的答案去哪了?它链接到some information on stack limits

    【讨论】:

      【解决方案4】:

      因为堆栈溢出。尝试在堆上分配该数组。

      【讨论】:

        【解决方案5】:

        您正在尝试分配 1820 * 285 * 5 * sizeof(int) 字节 = 大约 10MB(如果 sizeof(int) == 4)。这可能比您的操作系统默认为您提供的堆栈分配字节数更多,因此您会遇到堆栈溢出/段错误。

        您可以通过在创建线程时请求额外的堆栈、在堆上分配或更改操作系统默认值来解决此问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-30
          • 1970-01-01
          • 1970-01-01
          • 2020-09-05
          • 1970-01-01
          • 2012-07-12
          • 1970-01-01
          • 2020-01-05
          相关资源
          最近更新 更多