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.