复合文字有没有办法在c99中有可变长度?

我知道通过正常声明数组,可以在运行时确定长度的数组:

char buf[len]; 

而且我知道我可以将数组声明为复合litral并将其分配给中间的指针:

 char *buf; .... buf = (char[5]) {0}; 

但是,将两者结合起来并不起作用(标准不允许)。

我的问题是:有没有办法实现以下代码的效果? (注释len

 char *buf; .... buf = (char[len]) {0}; 

谢谢。

该语言明确禁止这一点

6.5.2.5复合文字

约束

1类型名称应指定对象类型或未知大小的数组,但不能指定可变长度数组类型。

如果你需要这样的东西,你必须使用一个命名的VLA对象而不是compund literal。 但请注意,VLA类型不接受初始值设定项,这意味着您无法执行此操作

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

(我不知道这个限制背后的理由是什么。)

因此,除了使用命名的VLA对象之外,您还必须想出一些方法来将其归零,例如memset或显式循环。