[开发资料] 动态数组的C语言实现

[复制链接]
97|2
LOVEEVER 发表于 2025-8-14 15:00 | 显示全部楼层 |阅读模式
动态数组(dynarray.h/.c)
支持任意类型的动态数组,接口风格类似C++ vector。

  1. // dynarray.h
  2. #ifndef DYNARRAY_H
  3. #define DYNARRAY_H
  4. #include <stddef.h>
  5. typedefstruct {
  6.     void *data;
  7.     size_t elem_size;
  8.     size_t size;
  9.     size_t capacity;
  10. } dynarray_t;
  11. voiddynarray_init(dynarray_t *arr, size_t elem_size);
  12. voiddynarray_free(dynarray_t *arr);
  13. intdynarray_push_back(dynarray_t *arr, const void *elem);
  14. void *dynarray_at(dynarray_t *arr, size_t idx);
  15. #endif
  1. // dynarray.c
  2. #include "dynarray.h"
  3. #include <stdlib.h>
  4. #include <string.h>
  5. voiddynarray_init(dynarray_t *arr, size_t elem_size) {
  6.     arr->data = NULL; arr->elem_size = elem_size; arr->size = 0; arr->capacity = 0;
  7. }
  8. voiddynarray_free(dynarray_t *arr) { free(arr->data); arr->data = NULL; arr->size = arr->capacity = 0; }
  9. intdynarray_push_back(dynarray_t *arr, const void *elem) {
  10.     if (arr->size == arr->capacity) {
  11.         size_t newcap = arr->capacity ? arr->capacity * 2 : 4;
  12.         void *newdata = realloc(arr->data, newcap * arr->elem_size);
  13.         if (!newdata) return-1;
  14.         arr->data = newdata; arr->capacity = newcap;
  15.     }
  16.     memcpy((char*)arr->data + arr->size * arr->elem_size, elem, arr->elem_size);
  17.     arr->size++;
  18.     return0;
  19. }
  20. void *dynarray_at(dynarray_t *arr, size_t idx) {
  21.     return (idx < arr->size) ? (char*)arr->data + idx * arr->elem_size : NULL;
  22. }

AdaMaYun 发表于 2025-9-18 08:53 | 显示全部楼层
动态数组使用非常简单方便
小夏天的大西瓜 发表于 2025-9-28 17:40 | 显示全部楼层
动态数组的C语言实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

350

主题

2689

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部