头文件片段
// mln_array.hstruct mln_array_attr
{void *pool; // 自定义内存池结构指针array_pool_alloc_handler pool_alloc; // 自定义内存池分配函数指针array_pool_free_handler pool_free; // 自定义内存池释放函数指针array_free free; // 用于对数组元素做资源释放的函数指针mln_size_t size; // 单个数组元素的字节大小mln_size_t nalloc; // 初始数组长度,后续数组按照两倍进行扩张
};typedef struct
{void *elts;mln_size_t size;mln_size_t nalloc;mln_size_t nelts;void *pool;array_pool_alloc_handler pool_alloc;array_pool_free_handler pool_free;array_free free;
} mln_array_t;
代码段
#include<stdio.h>
#include<string.h>
#include "mln_array.h"#include "mln_array.c"typedef struct
{int i;double d;char c[99];
} test_type ;
// 定义数组中元素类型 int main()
{test_type * ptr; // 元素类型指针 mln_array_t arr; // 数组 struct mln_array_attr attr; // 数组初始化属性attr.pool = NULL;attr.pool_alloc = NULL;attr.pool_free = NULL;attr.free = NULL;attr.size = sizeof(test_type);attr.nalloc = 1;// 设置各项属性值 mln_array_init(&arr, &attr);// 按照初始化属性attr初始化数组arr mln_size_t j, k, n;char C[] = "Hello world!";ptr = (test_type *)mln_array_push(&arr);// 向数组中追加1个元素,并将元素内存地址返回if(ptr == NULL) return 1;ptr -> i = 1;ptr -> d = 1.999999;for(k=0; k<strlen(C); k++)ptr -> c[k] = C[k];ptr -> c[strlen(C)] = '\0';ptr = (test_type *)mln_array_pushn(&arr, 2);// 向数组中追加n个元素,并将这些元素的内存首地址返回if(ptr == NULL) return 1;for(j=0; j<2; j++){ptr[j].i = j + 2;ptr[j].d = j + 2.999999;for(k=0; k<strlen(C); k++)ptr[j].c[k] = C[k];ptr[j].c[strlen(C)] = '\0';}ptr = mln_array_elts(&arr); // 获取数组所有元素的起始地址n = mln_array_nelts(&arr); // 获取数组的元素个数for(j=0; j<n; j++){printf("%d\n", ptr[j].i);printf("%lf\n", ptr[j].d);printf("%s\n", ptr[j].c);puts("");}mln_array_destroy(&arr);// 释放指定数组arr的所有元素内存return 0;
}