我想定義一個非常大的二維數組。但它給我分段錯誤?二維數組的分段錯誤
#include <stdio.h>
int main() {
int i;
int temp[4000][5000];
for (i = 0; i < 5; i++)
{
printf ("Hello World\n");
}
}
任何人都可以請建議我一些其他方式嗎?內存初始化有問題嗎?在此先感謝
我想定義一個非常大的二維數組。但它給我分段錯誤?二維數組的分段錯誤
#include <stdio.h>
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);
你可以。您只需將指針設置爲正確的數組部分。 – Ari
感謝@Ari的幫助 –
int temp[4000][5000];
這是一個非常大的陣列,比堆棧的正常大小的方式做大,你因爲stack overflow分割故障。考慮使用動態分配。
您需要爲這樣的大陣列使用動態分配的陣列。
嘗試:
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]);
}
看起來很可怕。一個單一的分配應該是所有需要的。 –
@Ari這woking罰款..有沒有辦法,當我可以malloc完整的5000 * 4000?在一行中 –
@Vishwadeep'malloc(4000 * 5000 * sizeof(int))'足夠 – Kunal
有空間的自動變量只有有限的量,你的陣列不適合。使其成爲全局變量。 –
假設你的系統上有一個「int」是4個字節,你正試圖創建一個需要80MB空間的數組。使用動態分配。 – Kunal