Код ниже иногда не срабатывает при вызове buffer = (char*) realloc(buffer, allocated * sizeof(char));
(обозначен ниже), который я использую для динамического выделения пространства для char*
, путем выделения 1 символа изначально и удваивания выделенной суммы каждый раз у меня уже недостаточно памяти для хранения строки.realloc терпит неудачу после нескольких вызовов, только если не отладка
У меня очень похожий код во многих других частях моего проекта, с той же политикой распределения памяти и вызовами (меняя только тип 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 выделено = 1;' 'size_t быть выделено = 16;'? – alk
Это было бы моим предположением, либо это, либо он действительно хочет перейти от 16 символов до 2 в первом раунде (что было бы ... странно). – WhozCraig