大型二维阵列时的Seg故障

时间:2011-12-09 15:42:55

标签: c arrays

我正在编写一个程序来对DNA序列进行一些分析。 一切都很好,除了这件事。 我想声明一个大小为m * n的二维数组,其中m和n是从输入文件中读取的。 现在的问题是,如果m和n太大了。例如,如果m = 200且n = 50000 然后我在我声明我的数组的那一行得到一个seg错误。

array[m][n];

任何想法如何克服这一点。我确实需要这样一个数组,因为我的整个逻辑取决于如何处理这个数组。

5 个答案:

答案 0 :(得分:4)

可能你的堆栈空间不足 你能不能使用malloc在堆上动态分配数组?

如果您不知道如何做,可能需要查看 this 答案。

答案 1 :(得分:2)

正如其他人所说,在堆栈上分配大型VLA(可变长度数组)并不是一个好主意。使用malloc

分配它
double (*array)[n] = malloc(sizeof(double[m][n]));

并且你有一个像以前一样的对象,那就是编译器完全知道如何处理单个元素array[i][j],并且分配仍然在内存中给你一个连续的blob。

不要忘记做

free(array);

在你的范围的最后。

答案 2 :(得分:1)

不确定您使用的是哪种类型,但对于以下代码,我假设为int。

而不是这样做:

int array[200][50000];

尝试这样做:

int** array = (int**)malloc(200);
for (int i = 0; i < 200; i++)
{
    array[i] = (int*)malloc(50000);
}

这将分配“堆”内存而不是“堆栈”内存。您要求超过300mb(如果您使用的是32位类型),那么您可能没有那么多“堆栈”内存。

确保在使用以下代码完成数组后进行清理:

for (int i = 0; i < 200; i++)
{
    free(array[i]);
}
free(array);

随意使用m和n而不是我上面使用的常量!

编辑:我最初是用C ++编写的,并转换为C.我对C内存分配/释放更加生疏,但我相信我做对了。

答案 3 :(得分:0)

你可能用完了堆栈空间。

例如,Windows为每个线程提供1MB堆栈。假设数组包含整数,并且您正在堆栈上创建它,那么您将创建一个40MB的堆栈变量。

您应该在堆上动态分配它。

答案 4 :(得分:0)

数组(如果是本地的)在堆栈中分配。对进程/线程的堆栈大小施加了某些限制。如果堆栈过度生长,将导致问题。

但是你可以使用malloc在堆中分配数组。典型的堆大小可能是4GB(这可能或多或少取决于OS / Architecture)。检查malloc的返回值以确保正确分配了数组的内存。