这个数组声明在 C 语言中有效吗?

Is this array declaration valid in C language?

  struct site
  {
    char name[];
    int no_of_pages;
  };

此声明在 C 中是否有效(对于 a=character 数组名称)。我收到一个错误,指出数组需要一个大小!

我得到的错误: 类型为 'char []' 的灵​​活数组成员 'name' 不在 结构的结尾 字符名称[];

这些需要位于结构的末尾,以便结构的内存可以扩展以包含它们。没办法从中间“手风琴”出来

添加到此的方式是为该结构“过度分配”,例如 sizeof(struct site) + sizeof(char) * N。您分配的额外内存可用作 name 属性.

的一部分

一般来说,对于像这样简单的事情来说,这是一个糟糕的计划,因为您真正需要的是 char* 并使用 malloc()strcpy() 复制其中的任何字符串缓冲区分配或 strdup() 如果您有权访问 POSIX 函数。

所以你有两个选择:

struct site
{
  int no_of_pages;
  char name[];
};

这必然意味着您不能拥有任何其他“可扩展”属性,或者:

struct site
{
  char* name;
  int no_of_pages;
};

想吃多少就吃多少。

如果您有一个带有元数据的可变长度数组,则可以更好地说明此技术的用处,如下所示:

struct page {
  char *name;
  int links_count;
  struct link links[];
}

现在您可以在末尾轻松过度分配和使用这个 links 数组。这可以转换为 struct link links* 并独立分配,但这涉及两次分配而不是一次分配,因此它可能有缺点。您需要非常仔细地考虑使用此技术。