Create a gist now

Instantly share code, notes, and snippets.

Simple vector-implementation in C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "vector.h"
void vector_init(vector *v)
{
v->data = NULL;
v->size = 0;
v->count = 0;
}
int vector_count(vector *v)
{
return v->count;
}
void vector_add(vector *v, void *e)
{
if (v->size == 0) {
v->size = 10;
v->data = malloc(sizeof(void*) * v->size);
memset(v->data, '\0', sizeof(void*) * v->size);
}
if (v->size == v->count) {
v->size *= 2;
v->data = realloc(v->data, sizeof(void*) * v->size);
}
v->data[v->count] = e;
v->count++;
}
void vector_set(vector *v, int index, void *e)
{
if (index >= v->count) {
return;
}
v->data[index] = e;
}
void *vector_get(vector *v, int index)
{
if (index >= v->count) {
return NULL;
}
return v->data[index];
}
void vector_delete(vector *v, int index)
{
if (index >= v->count) {
return;
}
for (int i = index, j = index; i < v->count; i++) {
v->data[j] = v->data[i];
j++;
}
v->count--;
}
void vector_free(vector *v)
{
free(v->data);
}
int main(void)
{
vector v;
vector_init(&v);
vector_add(&v, "emil");
vector_add(&v, "hannes");
vector_add(&v, "lydia");
vector_add(&v, "olle");
vector_add(&v, "erik");
int i;
printf("first round:\n");
for (i = 0; i < vector_count(&v); i++) {
printf("%s\n", (char*)vector_get(&v, i));
}
vector_delete(&v, 1);
vector_delete(&v, 3);
printf("second round:\n");
for (i = 0; i < vector_count(&v); i++) {
printf("%s\n", (char*)vector_get(&v, i));
}
vector_free(&v);
return 0;
}
#ifndef VECTOR_H__
#define VECTOR_H__
typedef struct vector_ {
void** data;
int size;
int count;
} vector;
void vector_init(vector*);
int vector_count(vector*);
void vector_add(vector*, void*);
void vector_set(vector*, int, void*);
void *vector_get(vector*, int);
void vector_delete(vector*, int);
void vector_free(vector*);
#endif
@sshtmc
sshtmc commented Sep 18, 2012

Do you have a license in mind for this gist? Can we assume it's an MIT license?

@bart113
bart113 commented Jan 28, 2013

There is a bug in vector_delete. The v->size should be updated after new array is allocated (because it has different size than the old one). This leads to memory leaks and/or segfaults.

@cli248
cli248 commented May 27, 2013

for vector_add, is it should be "memset(v->data, '\0', sizeof(void *) * v->size)", not sizeof(void)

@darelf
darelf commented Dec 18, 2013

vector_delete doesn't have to reallocate a new memory block. Especially if you aren't changing the size of the array and are only allowing one item to be deleted at a time, then just start at the index that you are going to delete and shift everything down one, setting the last index to NULL.

@EmilHernvall
Owner

Just now noticed that people are using this. Sorry about the bugs -- I originally wrote this a long time ago, and wasn't a very accomplished C programmer at that point. I've revisited the code and fixed the bugs. Feel free to use the code under MIT license, if you wish.

@wduspa
wduspa commented Apr 5, 2016

i think line 60 "for (int i = index, j = index; i < v->count; i++) {" should be "for (int i = index+1, j = index; i < v->count; i++) {".

@etochy
etochy commented Feb 20, 2017 edited

For the void delete, index is useless in your implementation and just delete the last object onto the vector. You should do this to fix this bug :
void vector_delete(vector *v, int index)
{
if (index >= v->count) {
return;
}
for (int i = index +1, j = index; i < v->count; ++i) {
printf("i : %d , j : %d\n",i,j );
v->data[j] = v->data[i];
++j;
}
v->count--;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment