将动态大小的可变长度数组 (VLA) 初始化为 0

发布于 2024-10-06 13:56:51 字数 374 浏览 2 评论 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));

相反?

The following line of code, which creates a variable-length array on the stack:

char name[length] = {'\0'};

Generates the following compiler diagnostics:

error: variable-sized object may not be initialized
warning: excess elements in array initializer
warning: (near initialization for ‘name’)

What options are available to me for initializing VLAs? Am I forced to use a line such as:

memset(name, 0, sizeof(name));

Instead?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明媚如初 2024-10-13 13:56:52

是的,您必须编写用于初始化 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):

    1. The type of the entity to be initialized shall be an array of
      unknown size or an object type that is
      not a variable length array type.

    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.

    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文