cstructsizeof

sizeof single struct member in C


I am trying to declare a struct that is dependent upon another struct. I want to use sizeof to be safe/pedantic.

typedef struct _parent
{
  float calc ;
  char text[255] ;
  int used ;
} parent_t ;

Now I want to declare a struct child_t that has the same size as parent_t.text.

How can I do this? (Pseudo-code below.)

typedef struct _child
{
  char flag ;
  char text[sizeof(parent_t.text)] ;
  int used ;
} child_t ;

I tried a few different ways with parent_t and struct _parent, but my compiler will not accept.

As a trick, this seems to work:

parent_t* dummy ;
typedef struct _child
{
  char flag ;
  char text[sizeof(dummy->text)] ;
  int used ;
} child_t ;

Is it possible to declare child_t without the use of dummy?


Solution

  • Although defining the buffer size with a #define is one idiomatic way to do it, another would be to use a macro like this:

    #define member_size(type, member) (sizeof( ((type *)0)->member ))
    

    and use it like this:

    typedef struct
    {
        float calc;
        char text[255];
        int used;
    } Parent;
    
    typedef struct
    {
        char flag;
        char text[member_size(Parent, text)];
        int used;
    } Child;
    

    I'm actually a bit surprised that sizeof(((type *)0)->member) is even allowed as a constant expression. Cool stuff.