I think you made a small mistake: an &quot;incomplete array type&quot;, as allowed by the clause you cited, is one with empty brackets (int foo[]). Per 6.7.5.2.4:<p>&gt; If the size is not present, the array type is an incomplete type.<p>This is different from specifying the size as 0, which is still not allowed, per 6.7.5.2.1:<p>&gt; In addition to optional type qualifiers and the keyword static, the [ and ] may delimit an expression or *. If they delimit an expression (which specifies the size of an array), the expression shall have an integer type. If the expression is a constant expression, it shall have a value greater than zero.<p>Oh, and for the record, while you may be alluding to this in your last paragraph: another advantage of flexible array members is that indexing them is actually well-defined per the spec (if enough space has been allocated, of course), while AFAIK the spec has never added a special case for length-1 arrays, so accessing the &quot;extra elements&quot; is technically undefined behavior.  However, common compilers like GCC do treat length 1 specially, as an exception to optimizations that generally assume you won&#x27;t index out of bounds, so &#x27;technically&#x27; really is &#x27;technically&#x27; - it&#x27;s not something that some random future version of GCC is likely to break your code if you use.