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