动态数组(dynarray.h/.c)
支持任意类型的动态数组,接口风格类似C++ vector。
- // dynarray.h
- #ifndef DYNARRAY_H
- #define DYNARRAY_H
- #include <stddef.h>
- typedefstruct {
- void *data;
- size_t elem_size;
- size_t size;
- size_t capacity;
- } dynarray_t;
- voiddynarray_init(dynarray_t *arr, size_t elem_size);
- voiddynarray_free(dynarray_t *arr);
- intdynarray_push_back(dynarray_t *arr, const void *elem);
- void *dynarray_at(dynarray_t *arr, size_t idx);
- #endif
- // dynarray.c
- #include "dynarray.h"
- #include <stdlib.h>
- #include <string.h>
- voiddynarray_init(dynarray_t *arr, size_t elem_size) {
- arr->data = NULL; arr->elem_size = elem_size; arr->size = 0; arr->capacity = 0;
- }
- voiddynarray_free(dynarray_t *arr) { free(arr->data); arr->data = NULL; arr->size = arr->capacity = 0; }
- intdynarray_push_back(dynarray_t *arr, const void *elem) {
- if (arr->size == arr->capacity) {
- size_t newcap = arr->capacity ? arr->capacity * 2 : 4;
- void *newdata = realloc(arr->data, newcap * arr->elem_size);
- if (!newdata) return-1;
- arr->data = newdata; arr->capacity = newcap;
- }
- memcpy((char*)arr->data + arr->size * arr->elem_size, elem, arr->elem_size);
- arr->size++;
- return0;
- }
- void *dynarray_at(dynarray_t *arr, size_t idx) {
- return (idx < arr->size) ? (char*)arr->data + idx * arr->elem_size : NULL;
- }
|