Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Jul 2003 09:40:56 -0700
From:      Luigi Rizzo <rizzo@icir.org>
To:        Terry Lambert <tlambert2@mindspring.com>
Cc:        current@freebsd.org
Subject:   Re: what is the suggested way to do void * arithmetic ?
Message-ID:  <20030710094056.A73538@xorpc.icir.org>
In-Reply-To: <3F0D42FC.81DECF87@mindspring.com>; from tlambert2@mindspring.com on Thu, Jul 10, 2003 at 03:42:04AM -0700
References:  <20030710011956.A61125@xorpc.icir.org> <3F0D42FC.81DECF87@mindspring.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030710094056.A73538>