On Tue, 25 Apr 2023 at 20:21, Jonny Grant <j...@jguk.org> wrote:
>
>
>
> On 25/04/2023 13:22, Jonathan Wakely wrote:
> > On Tue, 25 Apr 2023 at 13:17, Jonathan Wakely wrote:
> >>
> >> On Tue, 25 Apr 2023 at 13:13, Jonny Grant wrote:
> >>>
> >>> Hello
> >>>
> >>> https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
> >>>
> >>> I wondered 'this_length' refers to in that example, it doesn't compile.
> >>
> >> It's not supposed to be a complete program.
> >>
> >>>
> >>> <source>: In function 'main':
> >>> <source>:13:34: error: 'this_length' undeclared (first use in this 
> >>> function)
> >>>    13 |   malloc (sizeof (struct line) + this_length);
> >>>       |                                  ^~~~~~~~~~~
> >>>
> >>>
> >>> https://godbolt.org/z/PWEcWsrKv
> >>>
> >>> I probably the size of the struct? So that would be 4 bytes for me, as it 
> >>> is just the int. That doesn't seem very useful. Maybe I am missing 
> >>> something.
> >>
> >> Yes, you are. Look at how it's used: malloc is called to allocate
> >> sizeof(struct line) + this_length bytes. Why would it be the size of
> >> the struct?
> >>
> >> It's the number of bytes that the zero-length contents array can hold.
> >
> > Maybe this change would help:
> >
> > --- a/gcc/doc/extend.texi
> > +++ b/gcc/doc/extend.texi
> > @@ -1705,6 +1705,9 @@ struct line *thisline = (struct line *)
> > thisline->length = this_length;
> > @end smallexample
> >
> > +In this example, @code{thisline->contents} is an array of @code{char} that
> > +can hold up to @code{thisline->length} bytes.
> > +
> > Although the size of a zero-length array is zero, an array member of
> > this kind may increase the size of the enclosing type as a result of tail
> > padding.  The offset of a zero-length array member from the beginning
>
> That looks like an improvement.
> Doesn't need to be a complete program, feels like a complete example is 
> better.
>
> Adding this to the example would help:
> size_t this_length = 10; /* line has capacity for 10 char */

That seems to prompt more questions though. Why 10 not another number?
Why size_t not the same type as the line.length member? If you have a
hardcoded 10 why not just use an array or 10 char in the struct?

So I'm not convinced your change improves it at all. The specific
value and the specific type are irrelevant when what's needed is just
some number. It isn't actually declared in the example because it's
not actually relevant to the thing being demonstrated.

Reply via email to