Sorry for the formatting, I'm not sure why the newlines got removed since I formatted this much more nicely, any reason why it happened? I could repost it in a more readble format
> From: jb_j...@hotmail.com > To: internals@lists.php.net > Date: Thu, 16 Sep 2010 09:56:59 +0000 > Subject: [PHP-DEV] Understanding the benefits of handling Bucket data in > PHP's HashTables > > > Hey guys (and girls), > I have been reading this list for sometimebut this is the first time I'm > actually posting something.This might fit better in a C\C++ forum but I base > my question on the notion that I confidence in my C skills and that there is > an underlying cause for the choice of PHP developers to save Bucket data the > way they do.If I am mistaken in posting this here please let me know. > I came to ponder this when working with hash functions > (zend_hash_find,zend_hash_add) and I saw that zend_hash_add (macro for > _zend_hash_add_or_update) accepts pData as void * but is usually passed an > address of a pointer like in: > zend_class_entry *ce;zend_hash_add(CG(class_table), > "class_name",class_length+1, &ce); > pData is in turn memcpy'd into a Bucket's pData element which is also void *, > passing the &ce suggests that what will get memcpy'd will be the contents of > &ce which is in turn the address pointed to by ce, the address of a > zend_class_entry struct, this suggests that the Bucket's pData element though > marked as void * actually servs as a void ** (since it points to an adress > which should be dereferenced as a pointer). > I validated this by looking at zend_hash_find which accepts pData as void **, > this time pData is to hold the address for the data retrieved by > zend_hash_find, this time I noticed the function call to be : > zend_class_entry **ce;zend_hash_find(CG(class_table), "class_name", > class_length+1, (void **) &ce); > and the data assigned to pData is :*pData = Bucket->pData; > By my logic by setting *pData I am setting the data held at the address in > pData itself which is &ce, this sets ce to point to an address of > Bucket->pData which as I established earlier is used as a void **. > I may be missing some basic understanding in pointers but I am pretty > confident that this is not the case and thus I am asking is there a specific > reason to use this sort of 'trickery' instead of of explicitly using void *, > I fail to see the harm in Bucket->pData being a pointer to the data itself > and the needed casts to be done instead of the current situtaiton where it > points to another address. > Thank you for any light you can shed on this. >