Calloc导致segfault而不是malloc

时间:2012-12-21 12:49:37

标签: c unix malloc calloc

我正在实现一个ringbuffer,在一个方法中,我从循环中的文件中读取CHUNKSIZE个字节,并将指针插入到ringbuffer中。

我在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);
}

2 个答案:

答案 0 :(得分:2)

malloccalloc之间的唯一区别是calloc将内存初始化为0,而malloc未初始化它。

因此,错误可能是您正在某处访问某些被calloc覆盖0的数据。我建议您检查b缓冲区的生命周期,或其他一些动态分配的数据。

答案 1 :(得分:1)

可能不是malloc段错误而calloc没有。为了证明这一点,在malloc-or-calloc行之后放置一个诊断puts( "allocated memory" );并再次尝试。循环后再扔一个。这应该向你证明,导致问题的不是功能本身的选择。

尝试使用像valgrind这样的运行时内存调试器。如果它在您第一次使用它运行程序时发现问题,我不会感到惊讶。如果事实证明你依赖像Alexandru C.建议的那样的记忆,我也不会感到惊讶。