I have an opaque structure like this:
// base.h
typedef struct Base Base;
Base *create_base(void);
void base_set_first(Base *, int);
// base.c
#include "base.h"
struct Base {
int first;
};
Base *create_base(void)
{
Base *new = malloc(sizeof(Base));
return new;
}
void base_set_first(Base *base, int value)
{
base->first = value;
}
The first member of another opaque structure is a pointer to Base:
// derived.h
typedef struct Derived Derived;
Derived *create_derived(void);
// derived.c
#include "derived.h"
#include "base.h"
struct Derived {
Base *base;
};
Derived *create_derived(void)
{
Derived *new = malloc(sizeof(Derived));
new->base = create_base();
return new;
}
Is it 'legal' to pass a structure Derived to a function that accepts a void * and then cast it to its first member?
void function(void *ptr)
{
Base *base = (Base *)ptr; // <-- it seems to work well but is this 'legal' or UB?
base_set_first(base, 1);
//...
}
Derived *d = create_derived();
function(d);