How to USE a byte offset. (Was: How to get a byte offset)
D. Richard Hipp
drh at romeo.cs.duke.edu
Tue Jun 5 22:56:10 AEST 1990
In article <1990May28.034643.6962 at cs.umn.edu> swie at cs.umn.edu
(S. T. Tan) writes:
>Is there an easy way to get the byte offset of a field in a structure without
>counting it manually ?
In article <16787 at haddock.ima.isc.com> karl at haddock.ima.isc.com
(Karl Heuer) writes:
> #define offsetof(T,mem) ((size_t)(char *)&((T *)0)->mem)
> #define offsetof(T,mem) ((char *)&((T *)0)->mem - (char *)0)
> #define offsetof(T,mem) ((char *)&((T *)&X)->mem - (char *)&X)
Having obtained the byte offset of some field in a structure, is there
a standard way of using that offset?
As an example, suppose I want to write a general-purpose library routine
to sort the elements of a linked list using the merge-sort algorithm.
(This would be a counterpart to "qsort") The routine looks like this:
void msort(void **head, int offset, int (*cmpfunc)(void*,void*));
"head" is the first element of the linked list. Each element of the
linked list is a structure which contains (amoung other things) a
pointer to the next element in the list. "offset" is the byte offset
to this pointer.
My question then is this: What is the best (preferred, most portable,
etc...) way to access, for instance, the second element of the linked
list. I've used:
#define NEXT(A) (*(void**)&(((char*)A)[offset]))
second = NEXT(*head);
But surely, if there is a standard "offsetof" macro, there must
also be some standard way of using that macro. What is it then?
Any comments, suggestions, or ideas are welcomed. I will summarize
e-mail responses to the net after one week. Tnx.
More information about the Comp.lang.c
mailing list