Относится к 0 байтам после последнего действительного байта в предыдущем malloc
Кажется, я непреднамеренно перезаписываю некоторые части памяти в моей C-программе. Чтобы это исправить, я добросовестно скачал DrMemory, и он выдаст ошибку, сообщающую мне о том, где происходит эта неприятность.
Одна из первых ошибок, которые я когда-либо получаю, это:
~~Dr.M~~ Note: @0:00:00.802 in thread 7376
~~Dr.M~~ Note: refers to 0 byte(s) beyond last valid byte in prior malloc
~~Dr.M~~ Note: prev lower malloc: 0x00c00eb0-0x00c00eb4
~~Dr.M~~ Note: instruction: cmp (%eax) $0x00
Согласно документации это означает, что я пытался получить доступ к последнему байту памяти, который я выделил первым. Как это неправильно?
Функция, которая вызывает ошибку:
void str_add_char(String* s, const char ch) {
size_t length = s->length;
if(length+1==s->size) {
s->size+=s->size/2+1;
s->c_str = (char*)realloc(s->c_str, s->size);
}
s->c_str[length]=ch;
s->c_str[length+1] = 0;
s->length++;
}
1 ответ
Вам нужно перераспределить s->size+1
-> +1 учитывает NULL-терминатор, который C использует для обозначения конца строки.