关于nginx中的四级指针

在nginx中有个四级指针,void **** conf_ctx,那么这个四级的指针在什么情况下用到呢?
答案可以在events block中找到。
在处理events这个指令时,它在conf_ctx中某个地方占住一个位置(指针看成数组),以index代表此处的下标。
在ngx_events_block函数中,先会申请一个指针,即代码中的ctx:
ctx = ngx_pcalloc(cf->pool, sizeof(void *));
这个指针后面就会放到index下标处。那么这个指针ctx,指向的是什么呢?那是个数组,各种event的配置的结构指针数组,从c语言上看,假设我们用一个void **tmp的二级指针来指向这个数组:
tmp = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));
*ctx = tmp;
我们看到此时ctx就是一个指向二级指针的指针,即void ***,而这个ctx又是conf_ctx的一个成员,很显然,conf_ctx被冠以void ****也理所当然。

而evnents是个MAIN_CONF(关于什么是MAIN_CONF,自己去查查这里就不说了),所以在解析时(即ngx_conf_handler),取到该index所在位置的地址:
conf = &(((void **) cf->ctx)[ngx_modules[i]->index])
这个conf,通过后面:
cmd->set(cf, cmd, conf);
即调用ngx_events_block时,通过:
*(void **) conf = ctx;
完成了index位置上面指针的放置,这个有C语言基础的同学都知道的,在函数内部给外面指针参数赋值的原理。

现在的问题是为什么非要用void ****,void *不可以吗?从语言层面来说,是可以的。我个人认为,把指针层次写全,对用户(或者是代码逻辑上层)来说,容易看到它的指向和层次。而写成void *,那么只是在实际使用者,根据需要时候来做类型强转,在其他的地方,看不出它的层次。

以上是我个人的理解,有其他见解的朋友欢迎一起讨论。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值