3

これを行う方法がまったくわからないため、現在コードはありません。自分で、各下位レベルの構造体に必要なバイト数を計算して、それにmallocすることはできますか?それは本当にひどいコーディングですね。これが私が一緒にマッシュしようとしている2つの構造体です:

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 に答える