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);