C: realloc(): invalid next size when reallocating vector

34 Views Asked by At

I'm implementing a dynamic unsigned array struct (equivalent to C++ std::vector) and I'm facing some issues when reallocating for push_back. Here is the relevant code:

#include <stdio.h>
#include <stdlib.h>

#define U_VECTOR_INITIAL_CAPACITY 1u
#define U_VECTOR_GROWTH_FACTOR 2u

struct UVector
{
    unsigned* p;
    unsigned size;
    unsigned capacity;
};

typedef struct UVector UVector;

// "Construtor"
UVector* newUVector()
{
    UVector* vec = (UVector*) malloc(sizeof(UVector));
    vec->capacity = U_VECTOR_INITIAL_CAPACITY;
    vec->size = 0;

    vec->p = (unsigned*) malloc(vec->capacity * sizeof(unsigned));
    return vec;
}

// "Destrutor"
void deleteUVector(UVector* self)
{
    free(self->p);
    free(self);
}

void push_back(UVector* self, unsigned val)
{
    if (self->size == self->capacity)
    {
        self->capacity *= U_VECTOR_GROWTH_FACTOR;
        self->p = (unsigned*) realloc(self->p, self->capacity);
    }
    self->p[self->size] = val;
    self->size++;
}

void fprintln(const UVector* self, FILE* stream)
{
    if (self->size > 0)
    {
        fprintf(stream, "%d", self->p[0]);
        for (unsigned i = 1; i < self->size; ++i)
            fprintf(stream, " %d", self->p[i]);
    }
    fprintf(stream, "\n");
}

int main()
{
    UVector* vec = newUVector();
    for (unsigned i = 0; i < 20; ++i)
    {
        push_back(vec, i);
    }
    fprintln(vec, stdout);
    deleteUVector(vec);

    return 0;
}

Is there something I'm missing? With some modifications in the code, such as printing, I sometimes get "malloc(): corrupted top size", but I'm not sure when it's happening. Thanks.

0

There are 0 best solutions below