2014-09-26 50 views
0

我運行在程序的問題,我不知道如何解決它。我正在處理一個文件,爲此我使用ftell獲得大小並將其存儲在M_size中。之後,我用N聲明一個無符號的char指針數組。然後在兩個函數a()和b()中使用該數組。C中的分段錯誤,同時聲明大指針數組

... 
unsigned long N = (M_size/ x); 
int LstElemSize = M_size % x; 
if(LstElemSize != 0){ 
    N += 1; 
}  
unsigned char *ptr_M[N] 
a(ptr_M) 
b(ptr_M) 
... 

函數A()實際上初始化ptr_M的每個元件在一個for循環:

a(){ 
    int i; 
    for(i = 0; i < N-1; i ++){ 
    ptr_M[i] = malloc(sizeof(unsigned char) * x); 
    } 
} 

函數B()迭代然後在每個元件,並且計算的東西,並在端部的每個元素被釋放。

我現在的問題是,當我嘗試處理文件例如1 GB的數組大小將在4 000 000左右,並出現分段錯誤(在我聲明我的數組)。如果我正確計算出它是8字節(字符指針)乘以4 000 000 = 32 MB。運行該程序的服務器有足夠的內存來保存該文件,但我想Response 1中提到的堆棧空間不夠。

我能做些什麼來解決我的問題?增加我的堆棧空間?謝謝!

+0

你試圖在堆棧上創建一個32MB的數組?堆棧通常在單位數字的MB範圍內,在使用VC++的Windows上,默認值僅爲1MB。 – 2014-09-26 18:23:26

回答

1

問題是,您正在定義ptr_M在堆棧中,它有一個小尺寸的限制。堆沒有這麼小的尺寸限制,並且能夠使用更多的系統內存。就像分配子數組一樣,您需要使用malloc()來分配ptr_M。 (請務必在某些時候也伴隨着所有這些子陣中解放出來!)

unsigned char **ptr_M = malloc(sizeof(unsigned char*) * N); 

此外,您的a()有一個差一錯誤。它忽略數組的最後一項。使用這個:

for(i = 0; i < N; i ++){ 
+1

你對錯過的錯誤是正確的,但實際上我正在做最後一個元素的其他事情。但沒有任何背景,你是絕對正確的! – 2014-09-26 22:56:14

0

malloc從堆中分配空間,而不是從堆棧分配空間。你可以嘗試增加你的堆看看編譯器選項。檢查那裏支持的heapsize的上限。

0

unsigned char *ptr_M[N]variable-length array聲明N號碼unsigned char在你的情況下棧上。您應該動態分配數組的空間。

unsigned char **ptr_M = malloc(sizeof(unsigned char*) * N); 
a(ptr_M); 
b(ptr_M); 
... 
//After you free each element in ptr_M 
free(ptr_M); 
+0

對於免費提示,我也會贊成這一點,但我不能。希望別人能做到!謝謝! – 2014-09-26 22:57:32