将动态大小的可变长度数组 (VLA) 初始化为 0
以下代码行在堆栈上创建一个可变长度数组:
char name[length] = {'\0'};
生成以下编译器诊断信息:
error: variable-sized object may not be initialized
warning: excess elements in array initializer
warning: (near initialization for ‘name’)
我可以使用哪些选项来初始化 VLA?我是否被迫使用诸如:
memset(name, 0, sizeof(name));
相反?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,您必须编写用于初始化 VLA 的代码(可以是您所描述的
memset()
,或者您喜欢的任何其他方式)。它只是 C 标准(第 6.7.8 节)中的一个约束:
上面在 2010 年编写的内容是正确的。从 C23 开始,VLA 现在可以使用空的初始化程序
{ }
进行初始化,与其他复合类型一样,它将递归地将每个元素和子元素初始化为零适当的类型。Yes, you must write code for the initialisation of VLAs (which could be a
memset()
like you have described, or any other way that you care to).It is simply a constraint in the C standard (§6.7.8):
The above was correct as written in 2010. As of C23, VLAs can now be initialised with an empty initialiser
{ }
, which as with other compound types will initialise each element and sub-element recursively to zero of the appropriate type.