【发布时间】:2011-12-31 10:45:55
【问题描述】:
我有以下结构
typedef struct _person {
int age;
char sex;
char name[];
}person;
我已经完成了一些基本的互联网搜索(但未成功),了解如何在不使用 malloc() 的情况下创建实例并使用灵活的数组成员初始化结构。
例如:对于像
这样的普通结构struct a {
int age;
int sex;
};
我们可以创建一个struct a 的实例并像这样初始化它
struct a p1 = {10, 'm'};
但是对于其中包含灵活数组的结构(如上面提到的_person),我们如何创建实例并像普通structures 那样进行初始化?
有可能吗?如果是这样,我们如何在初始化过程中传递数组大小和要初始化的实际值?
(或)
创建具有灵活数组的结构的唯一方法是使用 C99 规范中提到的 malloc() - 6.7.2.1 Structure and union specifiers - point #17,这是真的吗?!
【问题讨论】:
-
不能,struct 必须有编译时大小。
-
@Anycorn:具有灵活数组成员的结构确实具有编译时大小。
-
GCC 有一个扩展,允许你做类似
struct { size_t len; int data[]; } x = { 4, { 1, 2, 3, 4 } };的事情,它会工作,但它不是可移植的。您可以随时查看您的平台版本的alloca以获得可能更便携的解决方案,但您必须确保它们都以相同的方式运行并具有相同的实现怪癖。 -
@Charles 不是海报的意思 - 必须有某种 malloc 或等价物。
-
gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html 默认情况下它似乎是打开的(假设你没有使用
-ansi或任何会禁用它的东西)。
标签: c struct flexible-array-member