Let's suppose I have a struct and extract the offset to a member:
struct A {
int x;
};
size_t xoff = offsetof(A, x);
how can I, given a pointer to struct A
extract the member in a standard conforming way? Assuming of course that we have a correct struct A*
and a correct offset. One attempt would be to do something like:
int getint(struct A* base, size_t off) {
return *(int*)((char*)base + off);
}
Which probably will work, but note for example that pointer arithmetics only seem to be defined in the standard if the pointers are pointers of the same array (or one past the end), this need not be the case. So technically that construct would seem to rely on undefined behaviour.
Another approach would be
int getint(struct A* base, size_t off) {
return *(int*)((uintptr_t)base + off);
}
which also probably would work, but note that intptr_t
is not required to exist and as far as I know arithmetics on intptr_t
doesn't need to yield the correct result (for example I recall some CPU has the capability to handle non-byte aligned addresses which would suggest that intptr_t
increases in steps of 8 for each char
in an array).
It looks like there's something forgotten in the standard (or something I've missed).