2011-08-05 66 views
1

我不斷用下面的代碼得到分割。將4000更改爲1000使代碼運行良好。我會認爲我在這裏有足夠的記憶......我該如何解決這個問題?小(ish)2d陣列上的分割錯誤

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXLEN 4000 

void initialize_mx(float mx[][MAXLEN]) 
{ 
    int i, j; 
    float c=0; 
    for(i=0;i<MAXLEN;i++){ 
    for(j=0;j<MAXLEN;j++) mx[i][j]=c; 
    } 
} 
int main(int ac, char *av[]) 
{ 
    int i, j; 
    float confmx[MAXLEN][MAXLEN]; 
    initialize_mx(confmx); 
    return 0; 
} 
+0

@berry:你不能用malloc初始化一個數組類型,只能使用指針類型。 –

+0

@Dietrich Epp對不起,你當然是砰的一聲。顯示我的C是多麼生疏(以及爲什麼我不應該在累了的時候發佈臨時評論!) – berry120

回答

3

問題是你溢出堆棧。

當你調用initialize_mx()它爲它的局部變量(confmx在你的情況下)分配堆棧空間。如果局部變量太大,這個空間會受到操作系統的限制(如果你在linux上,請檢查ulimit)。

基本上就可以:

  1. 申報confmx作爲作爲cnicutar提出一個全局變量。
  2. Allocate memory space for your array dynamically.和一個指針傳遞給initialize_mx()

編輯:剛剛意識到你仍然必須分配內存空間,如果您傳遞一個指針,所以你有這兩個選項:)

+2

考慮到這個網站被稱爲StackOverflow,這是一個非常合適的問題。

+0

這是我在SO的第一個問題,我使用了我正在鏈接的教程作爲了解我的問題的指南;) – kirbuchi

1

如果我沒有做任何計算錯誤,那麼你在棧上使用4000 * 4000 * 4字節,這是61MB,這是很多。它適用於1000,因爲在這種情況下,你的堆棧上只使用了近4MB。

1

4000*4000*sizeof(float)==64000000。我懷疑你的操作系統可能對4到64 MB的堆棧大小有限制。

0

正如其他人指出短小ISN」對於分配在堆棧上的類變量auto小。

根據您的需求,您可以

static float confmx[MAXLEN][MAXLEN]; 

這將分配在BSS存儲。你可能想考慮一個不同的存儲系統,因爲人們通常只需要一個稀疏矩陣,並且有更多有效的方法來存儲和訪問許多單元爲零的矩陣。