[neomutt-devel] why casting pointer in mutt_mem_free

Pietro Cerutti gahr at gahr.ch
Tue Mar 27 09:35:47 CEST 2018


On Mar 27 18 15:04, Yubin Ruan wrote:
>In mutt/memory.c, what is point of casting ptr from (void *) to (void **)? Any
>ancient C technique here?
>
>void mutt_mem_free(void *ptr)
>{
>  if (!ptr)
>    return;
>  void **p = (void **) ptr;
>  if (*p)
>  {
>    free(*p);
>    *p = 0;
>  }
>}

Usage would be:

char *c = mutt_mem_malloc(10);
mutt_mem_free(&c);
assert(c == NULL);

That is, calling mutt_mem_free sets the pointer object pointed-to by the 
argument to NULL. For doing this, mutt_mem_free needs to get passed a 
pointer to the object, which is itself a pointer variable. Hence the &c 
in the invokation.

Now, any pointer is implicitely convertible to void* as per the C 
standard, but not to void**. This is why the explicit cast inside 
mutt_mem_free is needed to get back the original pointer-to-pointer from 
the expected pointer object.

Hope this helps... 

-- 
Pietro Cerutti
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 890 bytes
Desc: not available
URL: <http://mailman.neomutt.org/pipermail/neomutt-devel-neomutt.org/attachments/20180327/51295a77/attachment.sig>


More information about the neomutt-devel mailing list