这个数组声明在 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*
并独立分配,但这涉及两次分配而不是一次分配,因此它可能有缺点。您需要非常仔细地考虑使用此技术。
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*
并独立分配,但这涉及两次分配而不是一次分配,因此它可能有缺点。您需要非常仔细地考虑使用此技术。