2012-10-02 58 views
2

在我的C代碼中,我爲2d數組分配內存double E[2000][2000];,但是當我運行它時得到運行時錯誤Segmentation fault(core dumped),並且當我將數組大小減小到900左右時,代碼運行良好。無法分配內存

爲什麼它顯示運行時錯誤,因爲double取64位內存(IEEE標準),因此代碼大約需要32MB,與ram大小相比並不多。如果C中不支持,那麼我應該如何繼續如果我必須存儲的最大數據量是4000000,則每個數據都是浮點數。

+0

請向我們展示如何分配內存。 – Zeta

回答

6

您是否將E聲明爲局部變量?如果是這樣,你的堆棧內存不足。

void func() 
{ 
    double E[2000][2000]; /// definitely an overflow 
} 

使用動態分配:

double* E = malloc(2000 * 2000 * sizeof(double)); 
/// don't forget to "free(E);" later 

或者,如果你需要的二維數組,用曲折的:

double** E = malloc(2000 * sizeof(double*)); 

/* check that the memory is allocated */ 
if(!E) 
{ 
    /* do something like exit(some_error_code); to terminate your program*/ 
} 

for(i = 0 ; i < 2000 ; i) 
{ 
     E[i] = malloc(2000 * sizeof(double)); 

    /* check that the memory for this row is allocated */ 
    if(!E[i]) 
    { 
     /* do something like exit(some_error_code); to terminate your program*/ 
    } 
} 

然後重新分配是一個有點複雜:

for(i = 0 ; i < 2000 ; i) 
{ 
     free(E[i]); 
} 

free(E); 

PS如果你想保持你的數據在一個連續的方式,有一個訣竅(代碼Takuya Ooura's FFT Package

double **alloc_2d(int n1, int n2) 
{ 
    double **ii, *i; 
    int j; 

    /* pointers to rows */ 
    ii = (double **) malloc(sizeof(double *) * n1); 

    /* some error checking */ 
    alloc_error_check(ii); 

    /* one big memory block */ 
    i = (double *) malloc(sizeof(double) * n1 * n2); 

    /* some error checking */ 
    alloc_error_check(i); 

    ii[0] = i; 
    for (j = 1; j < n1; j++) { 
     ii[j] = ii[j - 1] + n2; 
    } 
    return ii; 
} 

void free_2d(double **ii) 
{ 
    free(ii[0]); 
    free(ii); 
} 

的你只需要調用

double** E = alloc2d(2000, 2000); 

free_2d(E); 
+3

'malloc/free'代替'C'的'new/delete'嗎? –

+0

解決了這個問題,謝謝 –

+0

另外,由於動態分配可能會失敗,因此在使用它之前,請檢查'malloc()'返回的NULL值。 – unwind

5

我承擔你只是簡單地將它分配在堆棧上

這可能會超過分配給程序的堆棧大小。

嘗試使用malloc(或C++中的new)或使用選項增加程序的默認堆棧大小。爲此,可以使用setrlimit()配置gcc。

setting stack size in gcc

請記住,即使堆棧大小增加時,這個大小的數組應該是全球性

你也可以使用一個語句就堆上分配一個二維數組,如果一個維度固定大小

double (* E)[COLUMN_SIZE]; 
int rows = 20; // this is dynamic and can be input from user at run time 
E = malloc(rows * sizeof(*E)); // this needs to be freed latter 

的更詳細的類似的例子 allocating 2d array without loops

+0

更好:'E = malloc(rows * sizeof(* E))''。不必再次提及行大小,因爲您不必。 –

+0

從我+1更多分配選項 –

+0

謝謝你剛剛意識到你提到。在答案中編輯 – fayyazkl

0

這取決於你分配陣列的位置。使用堆棧空間可能會導致溢出(除非你讓鏈接器分配一個額外的大堆棧)。

例如,這可能無法正常工作

int main() 
{ 
    double E[2000][2000]; // Likely an overflow 
} 

然而,陣列移動到靜態存儲區域

double E[2000][2000]; 

int main() 
{ 
    // use E here 
} 

可能會避免此問題。