From owner-freebsd-current@FreeBSD.ORG Thu Jul 10 10:38:44 2003 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id CB23337B401 for ; Thu, 10 Jul 2003 10:38:44 -0700 (PDT) Received: from smtpout.mac.com (A17-250-248-88.apple.com [17.250.248.88]) by mx1.FreeBSD.org (Postfix) with ESMTP id 4049F43F93 for ; Thu, 10 Jul 2003 10:38:44 -0700 (PDT) (envelope-from leimy2k@mac.com) Received: from webmail06.mac.com (webmail06-en1 [10.13.11.148]) by smtpout.mac.com (Xserve/MantshX 2.0) with ESMTP id h6AHchkc005292; Thu, 10 Jul 2003 10:38:43 -0700 (PDT) Received: from webmail06 (localhost [127.0.0.1]) by webmail06.mac.com (8.12.2/8.12.2) with ESMTP id h6AHchR7007388; Thu, 10 Jul 2003 10:38:43 -0700 (PDT) Message-ID: <6006001.1057858723473.JavaMail.leimy2k@mac.com> Date: Thu, 10 Jul 2003 12:38:43 -0500 From: David Leimbach To: Luigi Rizzo Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit cc: current@freebsd.org Subject: Re: what is the suggested way to do void * arithmetic ? X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Jul 2003 17:38:45 -0000 I always feel better when I convert void * to char * but that's probably because C++ doesn't allow pointer arithmetic on void *'s. The argument being that you don't know the size of what's being pointed to with a void * and therefore can't know how far to seek the the pointer to get to the next valid address. I think C takes a more low-level approach and says "void * is just an address void * + 1 means the next valid address". Anyway... it just seems to help when porting code between C/C++ to use char *... my $0.02. Dave On Thursday, July 10, 2003, at 11:40AM, Luigi Rizzo wrote: >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 >_______________________________________________ >freebsd-current@freebsd.org mailing list >http://lists.freebsd.org/mailman/listinfo/freebsd-current >To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org" > >