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