3

我目前没有代码,因为我根本不知道该怎么做。我可以自己计算每个较低级别的结构需要多少字节并将其分配给它吗?这真是糟糕的编码,不是吗。这是我试图混合在一起的两个结构:

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会保持不变吗?结构中的 malloc 一般如何表现?

4

3 回答 3

4

您的结构中没有指针成员,property因此您不需要malloc任何结构成员。
当您malloc使用该结构时,它将为您提供足够的内存来保存包括数组在内的所有结构成员,异常是指针结构成员(您没有任何)。

于 2012-05-27T07:10:51.393 回答
3

malloc没有演员表就可以了。它为整个数组分配连续的内存。结构内的数组都与它一起分配,它们是正确的数组而不是指针。

于 2012-05-27T07:13:08.920 回答
2

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 个元素。我本可以轻松地将其保留为一个数组。

于 2012-05-27T07:14:05.760 回答