不,灵活数组必须始终手动分配。但你可以使用calloc
初始化灵活部分和复合文字来初始化固定部分。我会把它包装在分配中inline
像这样的函数:
typedef struct person {
unsigned age;
char sex;
size_t size;
char name[];
} person;
inline
person* alloc_person(int a, char s, size_t n) {
person * ret = calloc(sizeof(person) + n, 1);
if (ret) memcpy(ret,
&(person const){ .age = a, .sex = s, .size = n},
sizeof(person));
return ret;
}
请注意,这会将分配是否成功的检查留给调用者。
如果你不需要size
当我将其包含在此处时,宏甚至就足够了。只是无法检查返回calloc
在做之前memcpy
。在我到目前为止编写的所有系统下,这都会相对较好地中止。一般来说我认为返回的malloc是次要的 http://gustedt.wordpress.com/2011/11/05/chasing-a-phantom-checking-the-return-of-malloc/,但在这个问题上意见分歧很大。
这也许(在这种特殊情况下)为优化器提供更多机会将代码集成到周围环境中:
#define ALLOC_PERSON(A, S, N) \
((person*)memcpy(calloc(sizeof(person) + (N), 1), \
&(person const){ .age = (A), .sex = (S) }, \
sizeof(person)))
Edit:这可能比函数更好的情况是A
and S
是编译时间常数。在这种情况下,复合文字,因为它是const
合格的,可以静态分配,并且其初始化可以在编译时完成。此外,如果代码中出现多个具有相同值的分配,则编译器将只能实现该复合文字的一个副本。