[OFF-TOPIC] C question

Benjamin Kaduk kaduk at mit.edu
Thu Apr 6 00:58:55 UTC 2017


On Wed, Apr 05, 2017 at 01:23:16PM -0300, Mario Lobo wrote:
> Hi There !
> 
> I don't know if this list is appropriate for this. 
> 
> if it isn't, please point me to the right direction.

It would probably be more appropriate on something like
StackOverflow.

> 
> How can I dynamically change the level of indirection?
> 
> 
> How can I dynamically switch:
> 
> ----------------
> KFNODE ***Nodes; to  KFNODE ****Nodes;
> ----------------
> Nodes = (KFNODE ***) malloc(5 * sizeof(KFNODE **));
> to Nodes = (KFNODE ****) malloc(5 * sizeof(KFNODE ***));
> ----------------
> 
> and so forth?
> 
> Is this possible at all?

It is a rather unnatural thing to want to do, so the solution would
also be rather unnatural.  It seems, though, that you could have a
loop construct that uses void* and void** for all levels except for
the leaf, since the underlying property of the non-leaf allocations
is that they are to hold pointers.  As you prepare to go to the next
layer of indirection  you cast the pointers from void* to void** and
dereference them.  Once your depth gets to the last level then you
can cast he void* to KFNODE* and actually handle the leaf elements.

But as I said, this is rather unusual style to do, and would require
replacing the x[a][b][c] with a loop that dereferences successive
pointers.

-Ben

P.S. All those extra allocations for intermediate arrays add up to a
fair bit of storage, and the extra cost of all the pointer
indirections does, too.  Sometimes it's more efficent to just
allocate a "flat" array of KFDNODE[x*y*z] and manually do index
arithmetic to emulate a multi-dimensional array.


More information about the freebsd-hackers mailing list