dynamic_array.c 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. typedef struct {
  4. size_t count;
  5. size_t capacity;
  6. } Header;
  7. #define ARR_INIT_CAPACITY 256
  8. #define arr_len(arr) ((Header *)(arr) - 1)->count
  9. #define arr_push(arr, x) \
  10. do { \
  11. if ((arr) == NULL) { \
  12. size_t st = sizeof(*(arr)) * ARR_INIT_CAPACITY + sizeof(Header); \
  13. Header *header = malloc(st); \
  14. header->count = 0; \
  15. header->capacity = ARR_INIT_CAPACITY; \
  16. (arr) = (void *)(header + 1); \
  17. } \
  18. Header *header = (Header *)(arr) - 1; \
  19. if (header->count >= header->capacity) { \
  20. header->capacity *= 2; \
  21. header = \
  22. realloc(header, sizeof(*(arr)) * header->capacity + sizeof(Header)); \
  23. (arr) = (void *)(header + 1); \
  24. } \
  25. (arr)[header->count++] = (x); \
  26. } while (0)
  27. #define arr_pop(arr) \
  28. do { \
  29. if ((arr) == NULL) { \
  30. size_t st = sizeof(*(arr)) * ARR_INIT_CAPACITY + sizeof(Header); \
  31. Header *header = malloc(st); \
  32. header->count = 0; \
  33. header->capacity = ARR_INIT_CAPACITY; \
  34. (arr) = (void *)(header + 1); \
  35. } \
  36. Header *header = (Header *)(arr) - 1; \
  37. if (header->count > 0) \
  38. header->count--; \
  39. } while(0)
  40. #define arr_free(arr) free((Header*)(arr)-1)
  41. int main(){
  42. int *numbers = NULL;
  43. // [header][numbers]
  44. // ^
  45. float *data = NULL;
  46. arr_push(numbers, 23);
  47. arr_push(numbers, 456);
  48. arr_push(numbers, 3128);
  49. arr_push(numbers, 79);
  50. arr_push(numbers, 69);
  51. printf("\nnumbers (nb_elements: %zu)\n", arr_len(numbers));
  52. for (int i = 0; i < arr_len(numbers); i++) {
  53. printf("%d\n", numbers[i]);
  54. }
  55. arr_push(data, 67);
  56. arr_push(data, 54);
  57. arr_push(data, 34.5);
  58. printf("\ndata (nb_elements: %zu)\n", arr_len(data));
  59. for (int i = 0; i < arr_len(data); i++) {
  60. printf("%f\n", data[i]);
  61. }
  62. arr_free(numbers);
  63. arr_free(data);
  64. return 0;
  65. }