Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 435
seininn Avatar asked Jan 27 '13 18:01

seininn


1 Answers

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.

like image 57
AnT Avatar answered Sep 20 '22 05:09

AnT