2012-12-21 67 views
1

我正在實現一個環緩衝區,並且在一個方法中,我正在從循環中的文件讀取CHUNKSIZE個字節,並將指針插入到環緩衝區中。Calloc導致段錯誤,但不是malloc

我正在做一個while循環。該代碼適用於malloc,但calloc會在循環結束時導致段錯誤。這真的很神祕。

下面是代碼:

fpos_t position = 0; 
fpos_t file_size = 0; 
fseek(file, 0L, SEEK_END); 
fgetpos(file,&file_size); 
fseek(file, 0L, SEEK_SET); 
char* b = calloc(CHUNKSIZE,sizeof(char)); 
// char* b = malloc(sizeof(char)*CHUNKSIZE); 
while(fread(b,1,CHUNKSIZE,file)){ 
    deposit(reader_buf,b); 
    // This always changes the cursor position by -150 to create overlapping chunks 
    fseek(file,-150,SEEK_CUR); 
    b = calloc(CHUNKSIZE,sizeof(char)); 
    // b = malloc(sizeof(char)*CHUNKSIZE); 
} 
+3

'CHUNKSIZE'的價值是什麼? deposit()對b指向的緩衝區有什麼作用?請注意,由於您從未釋放b,因此這是一個大內存泄漏。 – Jens

+0

很可能你的錯誤在其他地方,也許在'deposit'裏面。無論如何,你沒有向我們展示足夠的話語。但是,那麼這種類型的問題對於SO來說也不是很合適,這不是一個代碼評論網站,而是一個技術問答網站。 –

+0

我懷疑calloc正在擦掉一個指針,malloc離開了。 – kdubs

回答

1

這可能不是malloc段錯誤和calloc沒有。爲了證明這一點,在malloc-or-calloc行之後插入診斷puts("allocated memory");並再次嘗試。在循環之後再投一次。這應該證明你不是導致問題的功能本身的選擇。

嘗試使用運行時內存調試程序,如valgrind。如果第一次使用它運行程序時發現問題,我不會感到驚訝。如果事實證明你像Alexandru C.所建議的那樣依靠記憶被清理出來,我也不會感到驚訝。

2

malloccalloc之間的唯一區別是,calloc初始化存儲器0,malloc不初始化它。

所以這個錯誤可能是因爲你正在訪問某些地方被calloc覆蓋了0的數據。我建議您檢查b緩衝區的生命週期,或其他一些動態分配的數據。