2012-12-21 69 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缓冲区的生命周期,或其他一些动态分配的数据。