作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道通过正常声明数组可以在运行时确定长度的数组:
char buf[len];
而且我知道我可以将数组声明为复合字面量并将其分配给中间的指针:
char *buf;
....
buf = (char[5]) {0};
但是,将两者结合起来是行不通的(标准不允许)。
我的问题是:有什么办法可以实现下面代码的效果吗? (注意 len
)
char *buf;
....
buf = (char[len]) {0};
谢谢。
最佳答案
语言明确禁止这样做
6.5.2.5 Compound literals
Constraints
1 The type name shall specify an object type or an array of unknownsize, but not a variable length array type.
如果您需要这样的东西,您必须使用命名的 VLA 对象而不是复合文字。但是,请注意 VLA 类型不接受初始化器,这意味着您不能这样做
char buf[len] = { 0 }; // ERROR for non-constant `len`
(我不知道这个限制背后的理由是什么。)
因此,除了使用命名的 VLA 对象之外,您还必须想出一些方法将其清零,例如 memset
或显式循环。
关于c - 复合文字在c99中有什么方法可以变长吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14550557/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!