zend 引擎中Hashtable查找问题

yusaint 发布于 2015/04/24 00:08
阅读 404
收藏 0
PHP

收藏!数据建模最全知识体系解读!>>>

在zend的代码中,经常看到这样的写法,查找一个Hashtable中得某一项

zval **carrier = NULL;

(void)zend_hash_find(&EG(symbol_table), ZEND_STRS("_REQUEST"), (void **)&carrier);

但是zend_has_find函数的定义为:



ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, uint nKeyLength, void **pData)

我的疑惑是,为啥参数为void ** 类型,在传参的时候要写成 (void **)&carrier,为啥不能是

定义为zval * carrier;

然后调用的时候

(void)zend_hash_find(&EG(symbol_table), ZEND_STRS("_REQUEST"), (void **)&carrier);

加载中
0
hylent
hylent

HashTable除了能保存zval数据结构,还是可以保存其它的数据类型的,所以参数不可能是 zval *,实际上我感觉ht内部应该是保存的 void * 数据,这样传参 void ** 的话,就可以直接把void * 的地址通过参数赋值出去。

纯c开发扩展,我一直晕乎乎的,主要就是看有没有memory leak 和segmatation fault,要是有的话,就不断的试。如果可以的话,可以尝试一下用 zephir开发扩展。

0
l
littext

首先,在Zend中,HashTable的槽定义为 Bucket, 其中,pData为void *pData,并且还有一个变量为void *pDataPtr。 假如存储的对象是值,则使用pData保存值的指针,假如存储对象是指针,则使用pDataPtr保存指针本身。

然后,Zend中所有变量都是用 指针访问的。

如果你定义为 zval *carrier = NULL;这样,返回的时候把变量本身给你了。

如果你定义为 zval **carrier = NULL;这样,返回的时候把变量的指针给你了。

两种用法都不会报错。

返回顶部
顶部