Du kannst ja über die Adressen gehen.

Code:
void foo (void)
{
   foo_t * bar;
   int offset = (int) & bar->x - (int) bar;
   ...  
}
Aber sowas brauchst du nicht. Du kannst ja die ganze Struktur kopieren, also ab ihrem Anfang (als unsigned char*) einfach die Anzahl der Bytes (sizeof...). Falls du nicht die gesamze STruktur willst, dann organisierst du sie eben in Teil/Unterstrukturen.