From owner-freebsd-hackers Mon Mar 4 2:42:11 2002 Delivered-To: freebsd-hackers@freebsd.org Received: from mailf.telia.com (mailf.telia.com [194.22.194.25]) by hub.freebsd.org (Postfix) with ESMTP id 0CDB737B404 for ; Mon, 4 Mar 2002 02:42:02 -0800 (PST) Received: from d1o913.telia.com (d1o913.telia.com [195.252.44.241]) by mailf.telia.com (8.11.6/8.11.6) with ESMTP id g24Ag0114390 for ; Mon, 4 Mar 2002 11:42:00 +0100 (CET) Received: from falcon.midgard.homeip.net (h217n1fls20o913.telia.com [212.181.162.217]) by d1o913.telia.com (8.8.8/8.8.8) with SMTP id LAA00599 for ; Mon, 4 Mar 2002 11:42:00 +0100 (CET) Received: (qmail 63438 invoked by uid 1001); 4 Mar 2002 10:41:58 -0000 Date: Mon, 4 Mar 2002 11:41:58 +0100 From: Erik Trulsson To: Harti Brandt Cc: Ian , freebsd-hackers Subject: Re: A few questions about a few includes Message-ID: <20020304104158.GB63341@student.uu.se> Mail-Followup-To: Harti Brandt , Ian , freebsd-hackers References: <20020303180029.GA56041@student.uu.se> <20020304102750.O74223-100000@beagle.fokus.gmd.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20020304102750.O74223-100000@beagle.fokus.gmd.de> User-Agent: Mutt/1.3.27i Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG On Mon, Mar 04, 2002 at 10:29:18AM +0100, Harti Brandt wrote: > On Sun, 3 Mar 2002, Erik Trulsson wrote: > > ET>On Sun, Mar 03, 2002 at 10:27:17AM -0700, Ian wrote: > ET>> > > ET>> > In : > ET>> > > ET>> > /* > ET>> > * pargs, used to hold a copy of the command line, if it had a sane > ET>> > * length > ET>> > */ > ET>> > struct pargs { > ET>> > u_int ar_ref; /* Reference count */ > ET>> > u_int ar_length; /* Length */ > ET>> > u_char ar_args[0]; /* Arguments */ > ET>> > }; > ET>> > > ET>> > This does indeed seem to make little or no sense. Could someone explain > ET>> > this? Is ar_args supposed to be a pointer or what? > ET>> > ET>> This is a common technique for defining a structure which is some > ET>> descriptive information about an array of objects is followed by an > ET>> open-ended array of those objects. (In this case the "objects" are > ET>> characters.) The ar_args member of the structure gives a name to that > ET>> location in the structure without reserving any space (and thus when the > ET>> technique is used, there can only ever be one [0] member and it must be at > ET>> the end of the structure). You access the open-ended array of objects just > ET>> as you would any other array embedded within a structure, E.G. > ET>> instance->ar_args[n]. > ET>> > ET>> Not all compilers support defining zero-length arrays like this. And that's > ET>> a pity; it's an incredibly useful technique, and the alternatives to it are > ET>> not nearly as elegant and generally involve ugly recasting of pointers. > ET> > ET>For those compilers that don't support zero-length arrays one can still > ET>use the same trick but with a one-element array at the end of the > ET>struct. One just has to remember to that element into account when > ET>allocating memory for the structure. Slightly uglier, but not much. > ET> > ET>It might be worth mentioning that this trick is not actually allowed > ET>according to the C standard and in principle invokes undefined > ET>behaviour. OTOH, AFAIK the trick does work on all existing compilers, > ET>so while it is not standard-conforming it is quite portable. > > My ISO-C draft copy allows in section 6.7.2.1 paragraph 2 the last member > of a structure to be an incomplete array type and paragraph 16 shows an > example. Was this removed from the final standard? I think it is still there (and my draft copy says the same thing). I was thinking about the original C89 standard which does not allow it (and does not allow incomplete array types in structs). Guess I should have said which standard I was referring to. > > harti > -- > harti brandt, http://www.fokus.gmd.de/research/cc/cats/employees/hartmut.brandt/private > brandt@fokus.fhg.de > -- Erik Trulsson ertr1013@student.uu.se To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message