Skip to content
Create a gist now

Instantly share code, notes, and snippets.

Embed URL


Subversion checkout URL

You can clone with
Download ZIP
Simple vector-implementation in C
#include <stdio.h>
#include <stdlib.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);
// condition to increase v->data:
// last slot exhausted
if (v->size == v->count) {
v->size *= 2;
v->data = realloc(v->data, sizeof(void*) * v->size);
v->data[v->count] = e;
void vector_set(vector *v, int index, void *e)
if (index >= v->count) {
v->data[index] = e;
void *vector_get(vector *v, int index)
if (index >= v->count) {
return v->data[index];
void vector_delete(vector *v, int index)
if (index >= v->count) {
v->data[index] = NULL;
int i, j;
void **newarr = (void**)malloc(sizeof(void*) * v->count * 2);
for (i = 0, j = 0; i < v->count; i++) {
if (v->data[i] != NULL) {
newarr[j] = v->data[i];
v->data = newarr;
void vector_free(vector *v)
int main(void)
vector 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", 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", vector_get(&v, i));
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*);

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


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.


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


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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.