头文件片段
// mln_array.h
struct 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;
}