/* 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(T)) return NULL;

  s = malloc(sizeof(struct vector));
  /* 1st malloc failed */
  if (!s) return NULL;

  s->size = n;
  s->data = malloc(n * sizeof(T));
  /* 2nd malloc failed */
  if (!s->data) {
    /* clean up 1st malloc */
    free(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->data before s */
  free(s->data);
  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;
}