Lecture 4: vector_1.c, flexible array member

/* gcc -std=c11 */

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

typedef int T;

struct vector {
	size_t size;
	T data[];
};

struct vector *vector_alloc(size_t n, T initial_val) {
	struct vector *s;

	/* overflow */
	if (n > (SIZE_MAX - sizeof(struct vector)) / sizeof(T))
		return NULL;

	s = malloc(sizeof(struct vector) + n * sizeof(T));
	/* malloc failed */
	if (!s)
		return NULL;

	for (size_t i = 0; i < n; ++i)
		s->data[i] = initial_val;
	return s;
}

void vector_free(struct vector *s) {
	free(s);
}

int main(void) {
	size_t i, n = 10;
	struct vector *s = vector_alloc(n, 42);
	for (i = 0; i < n; ++i)
		printf("%zd\n", s->data[i]);
	vector_free(s);
	return 0;
}