[comp.lang.c] Structure Initialization using void *

bryant%ced.utah.edu@cs.utah.edu (Bryant Eastham) (06/21/91)

  I'll start off by saying that before submitting this article I read
the sections in H&S on pointers and initializers, and also wrote a small
program to test this out which compiled without warnings (gcc -Wall -ansi).

  The question is the following. I have a structure which will consist
of 3 fields. This structure comes in two flavors, the first uses
the first field as an integer flag, the second as a const char const *
and does not use the third field, while the second flavor uses the first
field as an integer flag, the second as a const STRUCT const * and uses
the third to store an integer. I want to have an array of these structures
initialized at compile-time.

  The obvious solution would be to use a union instead of a structure, but
that would require changing quite a bit of code and I don't know that it
would save me anything in the initialization area.  Another solution
would be to use a void * as the second element type and cast the value
whenever I use it.  This would result in the following code:

     typedef struct _one
       {
       ....
       } One;

     typedef struct _test
       {
       int
         flag;
       void
         *field2;
       int
         optional;
      
       } Test;

     One
       firstStructure;
     Test
       array [] =
         {
           {  1, "Test" },
           {  2, "Another Test" },
           { -3, &firstStructure, 5 }
         };

  Then I would just have to cast array [ i ].field2 using either
(const char const *) or (const STRUCT const *) to extract the data
that I need, based on the flag field.

  Does anyone see any problems with this usage of void *? The only thing
that bothers me is that someone reading the code might be confused by
the initialization. I cannot see any rules being broken here, but then
I am not perfect. :-)

  Any response would be appreciated.  Thanks in advance.

  Bryant Eastham
  bryant@ced.utah.edu