【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个元素空间,返回数组第一个元素地址 |
使用方法与注意事项:
- ngx_array_destroy在大多数情况下什么都不会做
- ngx_array_push_n至少给数组扩充n个元素空间,由于扩充元素可能会将以前的数组内容拷贝到新的空间,此时,以前的空间不会被释放掉,频繁使用该函数可能会造成极大的内存池空间浪费
- 调用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);
}
运行结果
截图如下: