2015-11-09 64 views
0
int main(int argc, const char * argv[]) { 
    int N,M; 
    std::cin >> N; 
    std::cin >> M; 
    bool member[N]; 
    for (int i= 0; i < N ; i++) { 
     member[i] = false; 
    } 
    int test[M][N]; 
    int testSize[M]; 
    /*//std::fill_n(testSize, M, 0); 
    for (int i = 0; i < M; i++) { 
     std::fill_n(test[M], N, -1); 
    }*/ 
    for (int i = 0; i < M; i++) { 
     for (int j = 0; j < N ; j++) { 
      test[i][j] = -1; 
     } 
     testSize[i] = 0; 
    } 
} 

這是我上面的C++代碼,那是簡單的代碼,不是嗎?C++:基本循環的EXC_BAD_ACCESS

但是當程序的M爲100000,N爲1000時,在第二個for循環中有EXC_BAD_ACCESS。

我不知道它爲什麼會發生。

如果放入較小尺寸的數據,則不會發生錯誤,但是這種情況使其成爲錯誤。

我正在解決一個算法問題,並面對未知的錯誤。

有什麼要解決我的計劃嗎?當你看到我的代碼時,我想要的是將數組test和testSize初始化爲相同的值; -1和0.

+2

這是無效的C++:你正在使用可變長度的數組。請啓用您的編譯器警告和'-pedantic'。 – emlai

+0

@zenith你究竟是什麼意思?我不明白你說什麼,我不認爲這是核心問題... – LKM

+0

http://stackoverflow.com/q/1887097/3425536 – emlai

回答

0

int test[M][N];在堆棧上分配一個M * N個元素的數組。當M == 100000和N == 1000時,它是一個包含1億個元素的數組。 int通常至少有4個字節,所以你試圖在一個堆棧上分配400MB的數組,這不適合默認的(或者可能是任何的)鏈接器設置。

你可以做的是使用mallocnew[]在堆上分配那麼多的內存。您也可以使用第三方類來操作矩陣,這將爲您做。

+0

我應該考慮另一種更有效的方式來存儲該數據嗎?有沒有解決方法?我首先有這樣的問題 – LKM

+0

等一下,還有更多呢!主要的問題是數組的大小在編譯時並不知道,所以即使M = 10和N = 2也不行。再說一次,你所說的沒有錯,但你忽略了另一個問題。 –

+0

@FabioTurati變長數組是C99特性,編譯器甚至可以在C++模式下支持它,它可能會工作。 – Paul