nginx之动态数组

数组

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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值