2Darrays的分段故障

我想定义一个非常大的2D数组。 但它给我分段错误?

#include  int main () { int i; int temp[4000][5000]; for (i = 0; i < 5; i++) { printf ("Hello World\n"); } } 

任何人都可以建议我一些其他方式? 内存初始化有问题吗? 提前致谢

您可以只在一个数组中分配整个表,但是您将无法使用两个方括号访问索引的数组数据:

 int * temp = malloc(4000*5000*sizeof(int)); 

要访问之前你写过temp[i][j]的元素(i,j),现在你应该按照以下方式计算索引:

 temp[i*5000+j]; 

并且不要忘记随后释放为你的桌子分配的内存:

 free(temp); 
 int temp[4000][5000]; 

这是一个非常大的数组,比堆栈的正常大小大,你会因堆栈溢出而出现分段错误。 请考虑使用动态分配。

您需要为这样的大型数组使用动态分配的数组。

尝试:

 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]); } 

在这里你可以找到使用单个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]); }