1

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

我在一个while循环中这样做。该代码可以正常工作,malloccalloc会在循环结束时导致段错误。这真的很神秘。

这是代码:

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);
}
4

2 回答 2

2

malloc和之间的唯一区别calloccalloc将内存初始化为 0,而malloc不是初始化它。

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

于 2012-12-21T13:17:56.893 回答
1

这可能不是malloc段错误,calloc也不是。为了证明这一点,puts( "allocated memory" );在 malloc-or-calloc 行之后放置一个诊断,然后再试一次。在循环之后立即抛出另一个。这应该向您证明,导致问题的不是功能本身的选择。

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

于 2012-12-21T13:55:33.813 回答