/* gcc -std=c11 */ #include #include #include 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; }