5

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

char buf[len];

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

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

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

我的问题是:有什么办法可以实现下面代码的效果?(注len

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

谢谢你。

4

1 回答 1

8

该语言明确禁止这样做

6.5.2.5 复合文字

约束

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

如果你需要这样的东西,你必须使用命名的 VLA 对象而不是复合文字。但是,请注意 VLA 类型不接受初始值设定项,这意味着您不能这样做

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

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

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

于 2013-01-27T18:21:04.663 回答