我想定义一个非常大的2D数组。但它给我分段错误?
#include <stdio.h>
int main () {
int i;
int temp[4000][5000];
for (i = 0; i < 5; i++)
{
printf ("Hello World\n");
}
}
任何人都可以通过其他方式向我推荐吗?内存初始化有问题吗?提前致谢
答案 0 :(得分:4)
您可以只在一个数组中分配整个表,但是您将无法使用两个方括号访问索引的数组数据:
int * temp = malloc(4000*5000*sizeof(int));
访问之前编写temp[i][j]
的元素(i,j),现在您应该按照以下方式计算索引:
temp[i*5000+j];
并且不要忘记随后释放为你的桌子分配的内存:
free(temp);
答案 1 :(得分:3)
int temp[4000][5000];
这是一个非常大的数组,比正常的堆栈大小,你会因stack overflow而出现分段错误。请考虑使用动态分配。
答案 2 :(得分:2)
您需要为这样的大型数组使用动态分配的数组。
尝试:
int* temp[4000];
for(i = 0; i < 4000; ++i) temp[i] = malloc(5000 * sizeof(int));
...
for(i = 0; i < 4000; ++i) free(temp[i]).
包含错误检查的整个程序:
int main () {
int i, j;
int* temp[4000];
for (i = 0; i < 4000; ++i)
{
temp[i] = malloc(5000 * sizeof(int));
if (temp[i] == NULL)
{
for (j = 0; j < i; ++j) free(temp[i]);
exit(1);
}
}
for (i = 0; i < 5; i++)
{
printf ("Hello World\n");
}
for (i = 0; i < 4000; ++i) free(temp[i]);
}
Here你可以找到使用单个malloc调用来分配二维数组的函数。
我自己的简单版本:
int main () {
int i, j;
int* temp[4000];
int* array = malloc(4000 * 5000 * sizeof(int));
if (malloc_tmp == NULL) exit(1);
for (i = 0; i < 4000; ++i)
{
temp[i] = array + (i * 5000);
}
for (i = 0; i < 5; i++)
{
printf ("Hello World\n");
}
free(temp[0]);
}