關於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 *,那麼只是在實際使用者,根據需要時候來做類型強轉,在其他的地方,看不出它的層次。

以上是我個人的理解,有其他見解的朋友歡迎一起討論。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章