zero length array example does not compile

Jonny Grant jg@jguk.org
Tue Apr 25 19:21:24 GMT 2023



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 */



More information about the Gcc mailing list