Calloc вызывает segfault, но не malloc

Я реализую кольцевой буфер, и в одном методе я читаю CHUNKSIZE байт из файла в цикле и вставляю указатель в кольцевой буфер.

Я делаю это в цикле while. Код отлично работает с malloc, но calloc вызывает segfault в конце цикла. Это действительно загадочно.

Вот код:

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

person muxamilian    schedule 21.12.2012    source источник
comment
Каково значение CHUNKSIZE? Что делает deposit() с буфером, на который указывает b? Обратите внимание, что это одна большая утечка памяти, поскольку вы никогда не освобождаете b.   -  person Jens    schedule 21.12.2012
comment
скорее всего, ваша ошибка где-то в другом месте, возможно, внутри deposit. В любом случае вы не показываете нам достаточно, чтобы что-то сказать. Но кроме того, этот тип вопросов не очень подходит для SO, это не сайт для проверки кода, а сайт для технических вопросов и ответов.   -  person Jens Gustedt    schedule 21.12.2012
comment
Я подозреваю, что calloc стирает указатель, который malloc оставляет в покое.   -  person kdubs    schedule 21.12.2012
comment
CHUNKSIZE равно 1000, но я думаю, что это не имеет значения. b освобождается в другом потоке. Это не было задумано как обзор кода, я просто подумал, что упустил какую-то разницу между calloc и malloc   -  person muxamilian    schedule 21.12.2012


Ответы (2)


Вероятно, дело не в том, что malloc ошибается, а calloc нет. Чтобы доказать это, поставьте диагностику puts( "allocated memory" ); после строки malloc-or-calloc и повторите попытку. Бросьте еще один сразу после цикла. Это должно доказать вам, что проблема не в выборе самой функции.

Попробуйте использовать отладчик оперативной памяти, такой как valgrind. Я не удивлюсь, если он обнаружит вашу проблему при первом запуске вашей программы с ним. Я также не удивлюсь, если выяснится, что вы полагались на обнуленную память, как предполагает Александру С.

person Andy Lester    schedule 21.12.2012

Единственная разница между malloc и calloc заключается в том, что calloc инициализирует память до 0, а malloc не инициализирует ее.

Таким образом, ошибка может заключаться в том, что вы получаете доступ к некоторым данным, которые были перезаписаны 0 с помощью calloc. Я бы порекомендовал вам проверить жизненный цикл буфера b или некоторых других динамически размещаемых данных.

person Alexandru C.    schedule 21.12.2012