Is there any way for a compound literal to have variable length in c99?

c, c99, compound-literals

Solution

The language explicitly prohibits this

6.5.2.5 Compound literals

Constraints

1 The type name shall specify an object type or an array of unknown size, but not a variable length array type.

If you need something like this, you'd have to use a named VLA object instead of compund literal. However, note that VLA types do not accept initializers, meaning that you can't do this

char buf[len] = { 0 }; // ERROR for non-constant `len`

(I have no idea what the rationale behind this restriction is.)

So, in addition to using a named VLA object you'll have to come up with some way to zero it out, like a `memset` or an explicit cycle.

Problem

I know that arrays with lengths determined at runtime are possible by declaring the array normally: ``` char buf[len]; ``` and I know that I can declare an array as a compound litral and assign it to a pointer midway: ``` char *buf; .... buf = (char[5]) {0}; ``` However, combining the two doesn't work (is not allowed by the standard). My question is: Is there any way to achieve the effect of of the following code? (note `len`) ``` char *buf; .... buf = (char[len]) {0}; ``` Thank you.

Original source