Suitably aligned pointers
Alan J Rosenthal
flaps at dgp.toronto.edu
Sun Oct 16 01:24:47 AEST 1988
In article <345 at marob.MASA.COM> daveh at marob.UUCP (Dave Hammond) writes:
>The problem is the routines don't return a `suitably aligned' pointer,
>so the accuracy of casting the return to other than char * is in doubt.
>
>Can someone explain the technique used to suitably align a pointer ?
Well, it can't be done very nicely in a portable way. It can be done very
easily in a machine-dependent way: just do this:
if ((long)p & 1)
p++;
for example to enforce even alignment. Of course, your memory routine will
then have to allocate n + 1 bytes, counting the one you just skipped. (Don't
assume your machines require even alignment, check it out.)
To make it a little more portable, you have to over-align, so to speak -- there
is no way to figure out the alignment requirement but there is a way to figure
out something which must be a multiple of the alignment requirement. Take all
types you can think of (whether or not, for example, you must include all of
pointer-to-char, pointer-to-pointer-to-char, and pointer-to-int, can not be
determined, and since there are an infinite number of types this problem is not
solvable in general). Make a union of them, and then take sizeof it. If
you're worried that someone might have taken the ansi draft literally and left
out necessary padding of unions, wrap it in a struct first and take sizeof the
struct.
It is not possible to eliminate the assumption that a pointer can fit into some
integral type, although I suppose you could use unsigned long if you think that
would help. On machines on which a pointer cannot fit into any integral type,
I suppose that a little assembly language is required.
ajr
--
#define __STDC__ 0
More information about the Comp.lang.c
mailing list