java 数组成员初始化吗_如何使用灵活的数组成员初始化结构

不,必须始终手动分配灵活数组 . 但是您可以使用 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 限定的,可以静态分配,并且它的初始化可以在编译时完成 . 此外,如果代码中出现几个具有相同值的分配,则允许编译器仅实现该复合文字的一个副本 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值