gpt4 book ai didi

c - 如何使用灵活的数组成员初始化结构

转载 作者:太空狗 更新时间:2023-10-29 16:27:08 25 4
gpt4 key购买 nike

我有以下结构

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),我们如何创建一个实例并像我们对普通 结构 那样进行初始化?

有可能吗?如果是这样,我们如何传递初始化时的数组大小和要初始化的实际值?

(或)

创建具有灵活数组的结构的唯一方法是使用 C99 规范中提到的 malloc() - 6.7.2.1 Structure and union specifiers - point #17?!

最佳答案

不,灵活数组必须始终手动分配。但是您可以使用 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)))

编辑:AS 是编译时常量时,这可能比函数更好。在那种情况下,复合文字,因为它是 const 限定的,可以静态分配,并且可以在编译时完成它的初始化。此外,如果代码中出现多个具有相同值的分配,则编译器将被允许只实现该复合文字的一个副本。

关于c - 如何使用灵活的数组成员初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com