Date: Sun, 03 Mar 2002 10:27:17 -0700 From: Ian <freebsd@damnhippie.dyndns.org> To: freebsd-hackers <freebsd-hackers@freebsd.org> Subject: Re: A few questions about a few includes Message-ID: <B8A7AB05.AAE6%freebsd@damnhippie.dyndns.org> In-Reply-To: <XFMail.20020303091938.conrads@cox.net>
next in thread | previous in thread | raw e-mail | index | archive | help
> > In <sys/proc.h>: > > /* > * pargs, used to hold a copy of the command line, if it had a sane > * length > */ > struct pargs { > u_int ar_ref; /* Reference count */ > u_int ar_length; /* Length */ > u_char ar_args[0]; /* Arguments */ > }; > > This does indeed seem to make little or no sense. Could someone explain > this? Is ar_args supposed to be a pointer or what? This is a common technique for defining a structure which is some descriptive information about an array of objects is followed by an open-ended array of those objects. (In this case the "objects" are characters.) The ar_args member of the structure gives a name to that location in the structure without reserving any space (and thus when the technique is used, there can only ever be one [0] member and it must be at the end of the structure). You access the open-ended array of objects just as you would any other array embedded within a structure, E.G. instance->ar_args[n]. Not all compilers support defining zero-length arrays like this. And that's a pity; it's an incredibly useful technique, and the alternatives to it are not nearly as elegant and generally involve ugly recasting of pointers. -- Ian To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?B8A7AB05.AAE6%freebsd>