1

如果我将行的值保持为 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;
}
4

3 回答 3

4

是函数内部的matrix局部变量main。所以它是在机器调用堆栈上“分配”的。

这个堆栈有一些限制。

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

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

启发式:没有大于一千字节或两千字节的局部帧(局部变量大小的累积总和)。

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

于 2013-03-01T19:47:51.283 回答
2

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

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

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

于 2013-03-01T19:47:56.333 回答
1

您的系统不能允许您分配那么大的堆栈。matrix进行全局或使用动态分配(通过malloc和),你free应该没问题。

于 2013-03-01T19:47:43.523 回答