我正在实现一个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);
}
答案 0 :(得分:2)
malloc
和calloc
之间的唯一区别是calloc
将内存初始化为0,而malloc
未初始化它。
因此,错误可能是您正在某处访问某些被calloc
覆盖0的数据。我建议您检查b
缓冲区的生命周期,或其他一些动态分配的数据。
答案 1 :(得分:1)
可能不是malloc
段错误而calloc
没有。为了证明这一点,在malloc-or-calloc行之后放置一个诊断puts( "allocated memory" );
并再次尝试。循环后再扔一个。这应该向你证明,导致问题的不是功能本身的选择。
尝试使用像valgrind这样的运行时内存调试器。如果它在您第一次使用它运行程序时发现问题,我不会感到惊讶。如果事实证明你依赖像Alexandru C.建议的那样的记忆,我也不会感到惊讶。