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

时间:2013-01-27 18:19:13

标签: c c99 compound-literals

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

char buf[len];

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

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

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

我的问题是:有没有办法达到以下代码的效果? (注意len

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

谢谢。

1 个答案:

答案 0 :(得分:7)

该语言明确禁止此

  

6.5.2.5复合文字

     

<强>约束

     

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

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

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

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

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