struct ngx_array_s {
void *elts; //指向实际的数据存储区域;
ngx_uint_t nelts; //数组实际元素个数。
size_t size; //数组单个元素的大小,单位是字节。
ngx_uint_t nalloc; //数组的容量。
ngx_pool_t *pool; //该数组用来分配内存的内存池。
};
下面分别说明各字段的含义:
nalloc: 数组的容量。表示该数组在不引发扩容的前提下,可以最多存储的元素的个数。当nelts增长到达nalloc 时,如果再往此数组中存储元素,则会引发数组的扩容。数组的容量将会扩展到原有容量的2倍大小。实际上是分配新的一块内存,新的一块内存的大小是原有内存大小的2倍。原有的数据会被拷贝到新的一块内存中。
//创建指针,并调用ngx_array_init分配内存
/**
* 初始化一个数组
* p:内存池容器
* n:支持多少个数组元素
* size:每个元素的大小
*/
ngx_array_t*ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size);
//已创建ngx_array_t结构体时,创建数组
static inline int ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size);
voidngx_array_destroy(ngx_array_t *a);
//向数组中添加元素
void*ngx_array_push(ngx_array_t *a);
void*ngx_array_push_n(ngx_array_t *a, ngx_uint_t n);
//初始化数组
staticngx_inline ngx_int_t
ngx_array_init(ngx_array_t*array, ngx_pool_t *pool, ngx_uint_t n, size_t size)
例子:
typedef struct
{
u_char *name;
int age;
}Student;
ngx_array_t* pArray = ngx_array_create(cf->pool,1,sizeof(Student));
Student *pStudent = ngx_array_push(pArray);
pStudent->age = 10;
Students *pStudents = ngx_array_push_n(pArray,3);
pStudents->age = 1;
(pStudents + 1 )->age =2;
(pStudents + 2 )->age = 3;
//遍历
Student *pStudent = pArray->elts;
ngx_uint_i = 0;
for(; i < pArray->nelts;i++)
{
a = pStudent + i;
//....
}
不create也可以,例如:
struct stream_info_s {
u_char *pos;
ngx_int_t args;
} streams[4], *s;
ngx_array_t stream;
stream.nelts = 0;
stream.elts = &streams;
stream.size = sizeof(struct stream_info_s);
stream.nalloc = 4;
stream.pool = r->pool;
//添加
s = ngx_array_push(&stream);