1

いつ別の構造体へのポインターを使用するか、コピーを含める必要があるかについて混乱しています。たとえば、インベントリ内でProducts *prods;またはを使用する必要がありますか? Products prods;どうすればいいmallocですか?

typedef struct Products Products;
struct Products
{
    int  id;
    char *cat;
    char *name
};

typedef struct Inventory Inventory;
struct Inventory
{
    char* currency;
    int size;
    Products prods; // or Products *prods;
};
4

2 に答える 2

2

Kyle の回答である へのポインタを使用するかどうかの決定を補完するためProductsに、次のことを考える必要があります。

要素の数がわからない場合、Inventory構造体には少なくとも次の要素が含まれている必要があります。

typedef struct Inventory Inventory;
struct Inventory
{
    char *currency;
    int size, count;
    Products* prods;
    ... // other elements you should need
};

ポインターは次のように定義する必要があります (Inventory要素をインスタンス化する場合):

...
Inventory inv;
inv.size = _total_elems_you_will_need_
inv.prods = (Products *)malloc(inv.size * sizeof(Products));
...

一方、その量が常に固定されている場合は、Inventory(上で定義したポインターの代わりに) 次のようなものを使用して構造体を定義できます。

Products prods;      // if you'll need only one element.
Products prods[10];  // if you'll need only ten.
于 2012-04-24T01:42:41.883 に答える
1

コンパイル時に配列のサイズが不明な場合は、ポインターを使用する必要があります。各 Inventory 構造体に正確に 1 つの Products 構造体、または 10 または 100 が含まれることがわかっている場合は、単に を宣言しProducts prods[100]ます。ただし、実行時に任意のレコードを読み取り、コンパイル時に Inventory 構造体に含まれる Products レコードの数がわからない場合は、 を使用しますProducts *prods。また、malloc または realloc した量と、Products 構造体で埋めたメモリの量を追跡するためにsize、構造体要素も必要です。count

于 2012-04-24T01:28:08.317 に答える