对于typedef,我将如何执行以下操作?
typedef struct FriendStack {
bool is_resizable;
size_t max_size;
Friend* stack[]; // will have a variable length of friends
} FriendStack;是通过执行Friend**来转换它吗?或者它通常如何工作?
发布于 2021-02-01 09:52:18
使用灵活数组成员作为结构的最后一个成员的唯一目的是允许将可变大小的数据直接追加到同一内存段中的结构之后,然后以定义良好的方式访问该数据。
这意味着指针数组通常不是您想要的,而是一组数据。在某些特殊情况下,在那里分配一组指针可能是有意义的,但如果在这种情况下这样做,我无法判断。
通常的用例是:
typedef struct FriendStack {
bool is_resizable;
size_t max_size;
Friend stack[];
} FriendStack;
size_t n = something_variable;
FriendStack* fs = malloc( sizeof *fs + sizeof(Friend[n]) );
...
free(fs);现在,如果实际使用Friend* stack[],则分配它的语法与上面相同,只是在malloc中它变成了sizeof(Friend*[n])。还需要一个额外的循环来为每个指针分配一些东西:
for(size_t i=0; i<n; i++)
{
fs->stack[i] = malloc(...);
}但与第一个版本不同的是,这会在堆中的多个位置创建分段块,因此它要慢得多,而且代码整体上变得更加复杂。
https://stackoverflow.com/questions/65986554
复制相似问题