Относится к 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 использует для обозначения конца строки.

Другие вопросы по тегам