2013-10-25 113 views
0

我想定義一個非常大的二維數組。但它給我分段錯誤?二維數組的分段錯誤

#include <stdio.h> 

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

任何人都可以請建議我一些其他方式嗎?內存初始化有問題嗎?在此先感謝

+1

有空間的自動變量只有有限的量,你的陣列不適合。使其成爲全局變量。 –

+1

假設你的系統上有一個「int」是4個字節,你正試圖創建一個需要80MB空間的數組。使用動態分配。 – Kunal

回答

4

您可以分配整個表中只有一個數組,但你將無法使用兩個方括號索引來訪問數組數據:

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

訪問而在以前你寫temp[i][j]元素(I,J),現在你現在應該計算索引方式如下:

temp[i*5000+j]; 

,不要忘記釋放分配給你的表之後的記憶:

free(temp); 
+0

你可以。您只需將指針設置爲正確的數組部分。 – Ari

+0

感謝@Ari的幫助 –

3
int temp[4000][5000]; 

這是一個非常大的陣列,比堆棧的正常大小的方式做大,你因爲stack overflow分割故障。考慮使用動態分配。

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

看起來很可怕。一個單一的分配應該是所有需要的。 –

+0

@Ari這woking罰款..有沒有辦法,當我可以malloc完整的5000 * 4000?在一行中 –

+1

@Vishwadeep'malloc(4000 * 5000 * sizeof(int))'足夠 – Kunal