我正在编写一个程序来对DNA序列进行一些分析。 一切都很好,除了这件事。 我想声明一个大小为m * n的二维数组,其中m和n是从输入文件中读取的。 现在的问题是,如果m和n太大了。例如,如果m = 200且n = 50000 然后我在我声明我的数组的那一行得到一个seg错误。
array[m][n];
任何想法如何克服这一点。我确实需要这样一个数组,因为我的整个逻辑取决于如何处理这个数组。
答案 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的返回值以确保正确分配了数组的内存。