不,必须始终手动分配灵活数组 . 但是您可以使用 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 字段,因为我在这里包含它,一个宏甚至就足够了 . 只有在执行 memcpy 之前无法检查 calloc 的返回 . 在我编程到目前为止的所有系统中,这将相对较好地中止 . 一般来说,我认为return of malloc is of minor importance,但意见在很大程度上取决于该主题 .
这可能(在那种特殊情况下)为优化器提供了更多机会来将代码集成到周围环境中:
#define ALLOC_PERSON(A, S, N) \
((person*)memcpy(calloc(sizeof(person) + (N), 1), \
&(person const){ .age = (A), .sex = (S) }, \
sizeof(person)))
Edit: 这可能比函数更好的情况是 A 和 S 是编译时常量 . 在这种情况下,复合文字,因为它是 const 限定的,可以静态分配,并且它的初始化可以在编译时完成 . 此外,如果代码中出现几个具有相同值的分配,则允许编译器仅实现该复合文字的一个副本 .