free (): неверный следующий размер (быстрый) для вектора с изменяемым размером - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь реализовать вектор с изменяемым размером в C без использования функций realloc и calloc. Однако, когда я пытаюсь поместить много значений в конец массива, я получаю сообщение об ошибке free (): invalid следующего размера. Как я могу это исправить?

Я попытался освободить массив непосредственно перед его повторным размещением (закомментированный блок), но это вызывает ошибку сегмента, а не текущую ошибку.

typedef struct {
size_t size;
size_t maxsize;
  int* array;
}
vector_int_t;

// Push a new value into the vector_int_t, allocate just enough memory if
// the internal array is full.
void vector_int_push_back_v1( vector_int_t* this, int value )
{ 
  if( this->size == this->maxsize ) {
    int* temp = malloc(  4 * (sizeof( this->maxsize)+1)  );
    size_t j = 0;
    for( size_t i = 0; i < this->maxsize; i++ ) {
      temp[j] = this->array[i];
      j++;
    }    
    temp[this->size] = value;
    /*if( this->size == 0 ) {
      this->array = malloc( 4 * (sizeof(this->maxsize)+2));
      this->size++;
      this->maxsize++;
      size_t z = 0;
      for( size_t y = 0; y < this->maxsize; y++ ) {
        this->array[z] = temp[y];
        z++;
      }
    }
    else {
      free( this->array );*/
      this->array = malloc( 4 * (sizeof(this->maxsize)+2)  );
      this->size++;
      this->maxsize++;
      size_t h = 0;
      for( size_t k = 0; k < this->maxsize; k++ ) {
        this->array[h] = temp[k];
        h++;
      }
    free( temp );
  }
  else {
    this->size++;
    this->maxsize++;
    this->array[this->size - 1] = value;
  }

}

1 Ответ

0 голосов
/ 10 октября 2019

Эта ошибка обычно возникает при записи за пределы выделенной памяти.

Очень вероятным виновником является использование sizeof, например, malloc( 4 * (sizeof( this->maxsize)+1) ).

Если вы хотитечтобы выделить this->maxsize + 1 элементов, вы должны использовать только это, а не sizeof.

Но вы должны использовать sizeof, чтобы получить размер каждого элемента (например, sizeof *temp).

Так что утверждение

int* temp = malloc(  4 * (sizeof( this->maxsize)+1)  );

должно действительно выглядеть как

int* temp = malloc(  sizeof *temp * (this->maxsize+1)  );
...