what is the suggested way to do void * arithmetic ?
Luigi Rizzo
rizzo at icir.org
Thu Jul 10 09:40:59 PDT 2003
On Thu, Jul 10, 2003 at 03:42:04AM -0700, Terry Lambert wrote:
> Luigi Rizzo wrote:
> > in several places in ipfw2.c i have to move pointers across
> > structures of variable length (lists of ipfw2 instructions
> > returned by the getsockopt()), and i use the following type of code:
> >
> > void *next;
> > foo *p;
> > next = (void *)p + len;
> > foo = (foo *)p + len;
^^^^^^^^^^^^^^
sorry i meant p = (void *)p + len;
...
> I don't understand the second one. The first one blows up because
> you aren't parenthesizing, e.g.:
>
> next = (void *)(p + len);
>
> The compiler is complaining because it doesn't know sizeof(*((void *)0))
ok, it actually evaluates to 1 and i thought it was some standard, probably
it is not so i guess i have to cast to (char *) instead
thanks
luigi
> (pointer arithmatic is coerced to the type of the lvalue, in most
> cases of casts).
>
> Unless you are referencing them as array elements (in which case,
> packing becomes a problem for you, when referencing them as arrays
> of foo's, since you don't know how foo's are packed in an array),
> you should probably cast them to char for the arithmatic, and add
> them with byte counts.
>
> -- Terry
More information about the freebsd-current
mailing list