【nginx源码学习与运用 三】变长数组ngx_array_t

【nginx源码学习与运用】系列博客中的示例代码在csdn的代码托管服务器CODE上,地址https://code.csdn.net/u012819339/nginx_study ,你可以将其自由的下载到本地,或者通过Git来实时获取更新


相关结构

ngx_array_t结构

typedef struct {
    void        *elts; //数组元素地址
    ngx_uint_t   nelts; //当前使用元素个数,意义可由使用者决定
    size_t       size; //数组单个元素大小
    ngx_uint_t   nalloc; //数组容纳元素总个数
    ngx_pool_t  *pool; //该数组所依附的内存池
} ngx_array_t;

结构图

这里写图片描述

操作方法

函数 解释
ngx_array_create 创建一个包含n个元素的数组,size代表每个数组元素的大小,p代表给该数组分配空间的内存池对象,返回数组结构地址
ngx_array_destroy 销毁一个数组对象,大多数情况下什么事都不做
ngx_array_push 将数组a扩充一个元素空间,返回数组第一个元素地址
ngx_array_push_n 将数组a至少扩充n个元素空间,返回数组第一个元素地址

使用方法与注意事项:

  1. ngx_array_destroy在大多数情况下什么都不会做
  2. ngx_array_push_n至少给数组扩充n个元素空间,由于扩充元素可能会将以前的数组内容拷贝到新的空间,此时,以前的空间不会被释放掉,频繁使用该函数可能会造成极大的内存池空间浪费
  3. 调用ngx_array_create的时候预估好数组大小,否则以后扩充数组大小的时候会造成一定的内存池空间的浪费

示例代码

arvik将nginx中的部分基础结构代码提出来了,好作为新手学习练习使用。见 https://code.csdn.net/u012819339/nginx_study
main.c

/*
blog:   http://blog.csdn.net/u012819339
email:  1216601195@qq.com
author: arvik
*/

#include <stdio.h>
#include <string.h>
#include "ak_core.h"
#include "pt.h"

struct node_s
{
    int index;
    char *name;
};

char *type_name[] = 
{
    "jame",
    "arvik",
    "rose",
    "tom",
    "jack"
};

int main()
{
    ngx_pool_t *p;
    ngx_array_t *my_array;
    struct node_s *s1, *s2;
    int i = 0;

    p = ngx_create_pool(1000); 
    if(p == NULL)
        return -1;

    my_array = ngx_array_create(p, 5, sizeof(struct node_s));
    if(my_array == NULL)
        return -1;

    s1 = (struct node_s *)(my_array->elts);
    for(i = 0; i< 5; i++)
    {
        (s1+i)->name = type_name[i];
        (s1+i)->index = i;
        //printf("---%s\n", (s1+i)->name);
    }


    s2 = ngx_array_push_n(my_array, 2);
    (s2 + 5)->name = "hello";
    (s2 + 5)->index = i++;
    (s2 + 5 + 1)->name = "world";
    (s2 + 5 + 1)->index = 666;

    PT_Info("my_array info:\n");
    for(i = 0; i< 7; i++)
    {
        PT_Info("the %d element: name:%s, index:%d\n", i, (s1+i)->name, (s1+i)->index);
    }   

    ngx_array_destroy(my_array);
    ngx_destroy_pool(p);
}

运行结果

截图如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012819339/article/details/53490140