Re: what is the suggested way to do void * arithmetic ?

From: Jens Schweikhardt <schweikh_at_schweikhardt.net>
Date: Fri, 11 Jul 2003 21:05:07 +0200
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;
# > 
# > When using WARNS=5, the compiler in -current flags them with 'Warning
# > void * arithmetic'.
# > 
# > What is the best way to do the above given that i do need to use
# > these variable-size structures ?
# 
# I don't understand the second one.  The first one blows up because
# you aren't parenthesizing, e.g.:
# 
# 	next = (void *)(p + len);

Huh? next has type pointer-to-void so a cast is never necessary
to assign to it. This is the raison d'être for void pointers in C.

In standardese void is an incomplete type that can not be completed.
Incomplete types have no size. Therefore, any arithmetic on
pointer-to-void is undefined. One needs to cast to a non-void pointer
before doing arithmetic. Whether this is a char* or other depends on
what you want to do.

Some compilers by default assume sizeof(void) = 1 (e.g. the same as
char in all its qualifications) for simplicity, but this is far from
portable.

Regards,

	Jens
-- 
Jens Schweikhardt http://www.schweikhardt.net/
SIGSIG -- signature too long (core dumped)
Received on Fri Jul 11 2003 - 10:08:50 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:14 UTC