#include #include typedef struct { size_t count; size_t capacity; } Header; #define ARR_INIT_CAPACITY 256 #define arr_len(arr) ((Header *)(arr) - 1)->count #define arr_push(arr, x) \ do { \ if ((arr) == NULL) { \ size_t st = sizeof(*(arr)) * ARR_INIT_CAPACITY + sizeof(Header); \ Header *header = malloc(st); \ header->count = 0; \ header->capacity = ARR_INIT_CAPACITY; \ (arr) = (void *)(header + 1); \ } \ Header *header = (Header *)(arr) - 1; \ if (header->count >= header->capacity) { \ header->capacity *= 2; \ header = \ realloc(header, sizeof(*(arr)) * header->capacity + sizeof(Header)); \ (arr) = (void *)(header + 1); \ } \ (arr)[header->count++] = (x); \ } while (0) #define arr_pop(arr) \ do { \ if ((arr) == NULL) { \ size_t st = sizeof(*(arr)) * ARR_INIT_CAPACITY + sizeof(Header); \ Header *header = malloc(st); \ header->count = 0; \ header->capacity = ARR_INIT_CAPACITY; \ (arr) = (void *)(header + 1); \ } \ Header *header = (Header *)(arr) - 1; \ if (header->count > 0) \ header->count--; \ } while(0) #define arr_free(arr) free((Header*)(arr)-1) int main(){ int *numbers = NULL; // [header][numbers] // ^ float *data = NULL; arr_push(numbers, 23); arr_push(numbers, 456); arr_push(numbers, 3128); arr_push(numbers, 79); arr_push(numbers, 69); printf("\nnumbers (nb_elements: %zu)\n", arr_len(numbers)); for (int i = 0; i < arr_len(numbers); i++) { printf("%d\n", numbers[i]); } arr_push(data, 67); arr_push(data, 54); arr_push(data, 34.5); printf("\ndata (nb_elements: %zu)\n", arr_len(data)); for (int i = 0; i < arr_len(data); i++) { printf("%f\n", data[i]); } arr_free(numbers); arr_free(data); return 0; }