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.