Apache数组创建、使用的过程分析

1.这里我们以main函数中数组的使用为例:
ap_server_pre_read_config = apr_array_make(pcommands, 1, sizeof(char *));
ap_server_post_read_config = apr_array_make(pcommands, 1, sizeof(char *));
ap_sever_config_defines = apr_array_make(pcommands, 1, sizeof(char *));
上面是最早开始使用数组的地方。
下面来分析数组是如何创建的?
首先需要阐明的是创建的数组乃是一个指针数组,即里面的元素都是指针,这可以从第三个参数sizeof(char *)可以看出,并且还定义了一个指针指向数组的首地址,比如 ap_server_pre_read_config。
在传递的参数中,nelts=1, elt_size = sizeof (char *)  使用的内存池为 pcommands 。
在函数apr_array_make中,首先分配一个空间,由res指向它,但是,由于参数clear为1,重新分配了一个空间,同样由指针res指向它。最终,得到一个指针数组,并设定如下:
res->pool = p;
res->elt_size = elt_size = sizeof(char *);
res->nelts = 0;  //活动元素个数为0
res->nalloc = nelts = 1;

2.数组的使用
数组在main函数中的使用位于对命令行的解析中,如下:
case 'C' :
    new = (char **)apr_array_push(ap_server_post_read_config);   //
    *new = apr_pstrdup(pcommands, optarg);
    break;
......
Apache中对数组的使用类似于对堆栈的使用, apr_array_push的功能就是将二级指针指向需要添加或者删除的数组元素处,对应于上述的apr_array_push这一步。如果是添加元素,则将字符串所存放的空间地址放入到需要添加的数组元素中即可,对应于上述的apr_pstrdup这一步。
下面具体分析函数apr_array_push所进行的操作:
该函数中首先判断数组中活动元素个数和总的元素个数是否相等,即arr->nelts == arr->nalloc,如果相等,则说明需要增加空间。增加空间的方法如下:
如果arr->nalloc<=0,则只需要增加一个元素的空间;
如果arr->nalloc>0,这里延续上面的分析,则知道arr->nalloc为1,因此需要增加一倍的空间,至arr->nalloc *2  。
空间分配完后,将数组中的数据全都拷贝过去,并将新增加的空间全部初始化为0 。然后设定arr的字段elts 和 nalloc 以及 nelts。
最后返回一个需要添加数组元素的地址。

再来分析 函数apr_pstrdup(pcommands, optarg)。
总的来说,首先从内存池pcommands中分配空间存储字符串optarg,然后将该空间首地址添加到对应的数组元素中。


3.apr_array_pop函数的分析
该函数比较简单,首先检查数组是不是空的, 如果不是,则返回一个指向数组最后一个活动元素的地址即可。这里还没有将该元素取出,只是为下一步取出元素做初始的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值