UPD: Я, конечно, догадываюсь ЧТО тут написано. Но ЗАЧЕМ?!


int offset = (int)((void*)(&((struct Struct*)NULL)->field1));
func(abc, offset);

После получасового обсуждения с tsostik и onkija решили, что все написано правильно за исключением типа и отсутсвующего комментария.

А межплатформенной мины в следующем коде нет (по крайней мере до тех пор, пока смещение поля в структуре помещается в int):

int offset = (int)((void*)(&st->fileld1));
/* assert (sizeof (int) == sizeof (void*)); */
func (abc, offset);

Но, все-таки, лучше писать так:

#include <stddef.h>
...
size_t offset = offsetof (sturct Struct, field1);
func (abc, offset);