如果我将行的值保持为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;
}
答案 0 :(得分:3)
matrix
是main
函数中的局部变量。所以它在机器调用堆栈上“分配”。
这个堆栈有一些限制。
您应该使matrix
成为全局或static
变量,或者将其作为指针和堆分配(例如calloc
或malloc
)内存区域。不要忘记calloc
或malloc
可能会失败(通过返回NULL)。
堆分配这样的东西的一个更好的理由是矩阵的维度应该是一个变量或一些输入。在源代码中连接维度的原因很少。
启发式:没有大于一千字节或两千字节的局部框架(局部变量的累积总和)。
[当然,该启发式的有效例外]
答案 1 :(得分:2)
您正在分配堆栈变量,每个程序的堆栈都是有限的。
当你尝试分配太多的堆栈内存时,你的内核会通过发送一个SEGV信号来杀死你的程序,也就是分段错误。
如果你想分配更大的内存块,使用malloc
,这个函数将从堆中获取内存。
答案 2 :(得分:1)
您的系统不得允许您进行大量的堆栈分配。将matrix
设为全局或使用动态分配(通过malloc
和free
),您应该没问题。