我目前没有代码,因为我根本不知道如何做到这一点。我是否可以自己计算每个较低级别的结构需要多少字节并将其malloc到它?这真的很糟糕的编码,不是吗。这是我尝试混合在一起的两个结构:
struct property {
int d;
char name [111]; // I just malloc this like I would a normal array, right?
char descr [1025]; // Ditto.
}
struct category {
int d [413]; // The d's of all the child structs sorted highest to lowest.
char name [111];
struct property property [413]; // This. How do I allocate this?
}</code>
我必须做struct property* property = (struct property*) malloc(sizeof(struct property) * 413);
吗?内部阵列的混音会保持不变吗?结构中的 malloc 通常如何表现?
结构property
内没有指针成员,因此无需malloc
任何结构成员。
当您为结构malloc
时,它将为您提供足够的内存来容纳包括数组在内的所有结构成员,例外是指针结构成员(您没有)。
演员表的malloc
会很好。它为整个数组分配连续内存。结构体内部的数组都是随它一起分配的,它们是正确的数组而不是指针。
Sizeof 将为您提供整个结构的大小。 它正确地考虑了数组和结构的大小。
但是,413项似乎是任意的。 可变尺寸的结构会更适合您吗?
在这种情况下,提前计算大小以避免 malloc 是一个不错的性能建议。 Malloc 可能很慢,可能需要锁,并且堆可能会随着时间的推移而碎片化。 此示例演示如何在结构末尾使用指针而不是数组或可变长度数组创建"可变长度"结构:
struct category
{
int cItems; // need this if handling variable # of items now.
int *d; // ptr instead of array
char *name; // ptr again
struct property property[0]; // var length array
}
int cItems = 413; // or whatever
// this is a nifty trick to get the size of a variable length struct:
int cbCategory = (size_t)(&((struct category*)0)->property[cItems]);
int cbD = sizeof(int)*cItems;
int cbName = sizeof(char)*cItems;
struct category *pCategory = (struct category*)malloc(cbCategory + cbD + cbName);
// wire up d:
pCategory->d = (int*)((char*)pCategory + cbCategory);
// or wire d up this way:
pCategory->d = (int*)&pCategory->property[cItems];
// wire up name
pCategory->name = (char*)pCategory->d + cbD;
// or wire up name this way
pCategory->name = (char*)&pCategory->d[cItems];
// set items
pCategory->cItems = cItems;
注意,我假设 d 有 413 个元素。 我可以很容易地把它留给一个数组。