在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`