Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c99中,复合文字有没有办法具有可变长度?_C_C99_Compound Literals - Fatal编程技术网

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

在c99中,复合文字有没有办法具有可变长度?,c,c99,compound-literals,C,C99,Compound Literals,我知道,通过正常声明数组,可以在运行时确定长度的数组: char buf[len]; 我知道我可以将数组声明为复合litral,并在中途将其分配给指针: char *buf; .... buf = (char[5]) {0}; 但是,将两者结合起来是行不通的(标准不允许这样做) 我的问题是:有没有办法达到以下代码的效果?(注意len) 谢谢。语言明确禁止这样做 6.5.2.5复合文字 约束 1类型名称应指定对象类型或未知对象数组 大小,但不是可变长度数组类型 如果您需要类似的东西,那么必须使

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

char buf[len];
我知道我可以将数组声明为复合litral,并在中途将其分配给指针:

char *buf;
....
buf = (char[5]) {0};
但是,将两者结合起来是行不通的(标准不允许这样做)

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


谢谢。

语言明确禁止这样做

6.5.2.5复合文字

约束

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

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

char buf[len] = { 0 }; // ERROR for non-constant `len`
(我不知道这一限制背后的理由是什么。)


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

为什么
memset
不是一个选项?@AlexandreC。我正在尝试使用复合文字表示法实现第一个代码段的功能(在堆栈上动态分配内存)。如果您不关心编写有效的可移植C,可以使用
alloca
…感谢您的快速响应(和const.edits;))。然而,我知道标准禁止这样做。我试图避免在代码中乱放临时变量,并希望有一种语法能像复合文字一样方便。虽然如此,但很遗憾,因为可变复合文字在技术上应该是可能的,因为VLA是。希望下一个标准..@Seinin。我同意你使用临时职位。我认为这种用法的理想构造应该只是复合文字的第一部分。简单地使用空初始值设定项(float[n]){},因为我们所需要的只是空间,并且自动初始化可变长度数组的实用性可能是有限的。它与gcc{}扩展冲突,但是zeroinit也不是一个可怕的协议。
char buf[len] = { 0 }; // ERROR for non-constant `len`