【问题标题】:what causes segmentation fault in below program [duplicate]是什么导致以下程序中的分段错误[重复]
【发布时间】:2013-02-16 10:05:46
【问题描述】:

如果我将行的值保持为 100000,则程序可以正常工作,但是,如果我将 100 万行设为 1000000,则程序会给我分段错误。是什么原因?我在 Linux 2.6x RHEL 内核上运行。

#include<stdio.h>

#define ROWS 1000000
#define COLS 4

int main(int args, char ** argv)
{
  int matrix[ROWS][COLS];

  for(int col=0;col<COLS;col++)
  for(int row=0;row < ROWS; row++)
    matrix[row][col] = row*col;

  return 0;
}

【问题讨论】:

  • StackOverflow 上的 Stack Overflow...
  • 遗憾的是,没有办法在编译时捕获此类分配失败。尝试使用尽可能小的数组。如果您不确定,那么很可能您没有足够的堆栈空间;-)

标签: c arrays


【解决方案1】:

您的系统不能允许您分配那么大的堆栈。将matrix 设为全局或使用动态分配(通过mallocfree),应该没问题。

【讨论】:

    【解决方案2】:

    matrixmain 函数中的一个局部变量。所以它是在机器调用堆栈上“分配”的。

    这个堆栈有一些限制。

    您应该将matrix 设为全局变量或static 变量,或将其设为指针并堆分配(例如callocmalloc)内存区域。不要忘记callocmalloc 可能会失败(通过返回NULL)。

    堆分配这种东西的一个更好的理由是矩阵的维度实际上应该是一个变量或一些输入。在源代码中连接尺寸的原因很少。

    启发式:本地帧(局部变量大小的累积总和)不超过一千字节或两千字节。

    [当然,该启发式也有有效的例外]

    【讨论】:

      【解决方案3】:

      你正在分配一个栈变量,每个程序的栈是有限的。

      当您尝试分配过多的堆栈内存时,您的内核将通过发送一个 SEGV 信号(即分段错误)来终止您的程序。

      如果要分配更大的内存块,请使用malloc,此函数将从堆中获取内存。

      【讨论】:

        猜你喜欢
        • 2021-11-25
        • 2021-02-21
        • 1970-01-01
        • 2016-09-24
        • 2020-09-15
        • 2012-04-19
        • 1970-01-01
        相关资源
        最近更新 更多