Приведенный ниже код иногда дает сбой при вызове buffer = (char*) realloc(buffer, allocated * sizeof(char));
(отмечен ниже), который я использую для динамического выделения пространства для char*
, первоначально выделяя 1 символ и удваивая выделенную сумму каждый раз, когда уже имеющейся памяти недостаточно для хранения строки.
У меня есть очень похожий код во многих других частях моего проекта с той же политикой выделения памяти и вызовами (изменение только типа void*
, который я передаю на realloc
).
Я использую VS2010 для отладки проблемы, и когда я запускаю программу в режиме отладки, функция всегда завершается успешно.
Однако при вызове программы из командной строки велика вероятность того, что один из вызовов realloc через какое-то время завершится с ошибкой «Доступ к месту чтения нарушения» — правда, это происходит не постоянно, а только происходит после того, как приведенная ниже функция была вызвана несколько раз, при этом уже произошло много перераспределений.
Что еще более странно, я поместил несколько отпечатков до и после вызова realloc, чтобы подтвердить, было ли изменено местоположение указателя, и, когда я сделал это и запустил программу, вызовы realloc прекратили случайные сбои.
Что я делаю неправильно?
TOKEN
next_token_file(FILE* file,
STATE_MACHINE* sm,
STATE_MACHINE* wsssm)
{
char* buffer = (char*) malloc(sizeof(char));
size_t allocated = 1;
size_t i = 0;
while(1)
{
/*
... code that increments i by one and messes with sm a bit. Does nothing to the buffer.
*/
// XXX: This fails when using realloc. Why?
if(i + 1 >= allocated)
{
allocated = allocated << 1;
buffer = (char*) realloc(buffer, allocated * sizeof(char));
}
buffer[i] = sm->current_state->state;
/*
... more code that doesn't concern the buffer
*/
}
// Null-terminate string.
buffer[++i] = 0;
TOKEN t = {ret, buffer};
return t;
}
size_t allocated = 1;
не должно бытьsize_t allocated = 16;
? - person alk   schedule 20.08.2013