什么导致下面程序中的分段错误
如果我保持行的值为100000,程序工作正常,但如果我将行100万作为1000000,程序给我分段错误。 是什么原因? 我在linux 2.6x RHEL内核上运行。
#include #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; }
matrix
是main
函数内的局部变量。 所以它在机器调用堆栈上“分配”。
这个堆栈有一些限制。
您应该使matrix
成为全局变量或static
变量,或者使其成为指针并对内存区域进行堆分配(例如使用calloc
或malloc
)。 不要忘记calloc
或malloc
可能会失败(通过返回NULL)。
堆积分配这样的事情的更好理由是矩阵的维度应该是变量或某些输入。 在源代码中连接维度的原因很少。
启发式:没有大于一千字节或两千字节的局部框架(局部变量大小的累计和)。
[当然,启发式的有效例外]
您正在分配堆栈变量,每个程序的堆栈都是有限的。
当你尝试分配太多的堆栈内存时,你的内核将通过发送一个SEGV信号(即分段错误)来终止你的程序。
如果你想分配更大的内存块,使用malloc
,这个函数将从堆中获取内存。
您的系统不允许您进行大量的堆栈分配。 使matrix
全局化或使用动态分配(通过malloc
和free
),你应该没问题。