1

別の構造体内の構造体の配列にメモリを動的に割り当てる方法がわかりません。のように、ここに私の問題があります...メインを含むproject.cファイルがあり、項の追加、多項式の数値などの乗算など、すべてのポリ演算を処理する別のpolynomial.cファイルがあります。

これはpolynomials.hのヘッダーファイルです

typedef struct term{
    int coeff;
    int expo;
} TERM;

typedef struct polynomial {

int size;
// This needs to be changed to calloc.. not sure how within a struct
TERM terms[20];

} POLYNOMIAL;
...
...

また、これは、poly配列にメモリを動的に割り当てるproject.cファイル内にあります。

POLYNOMIAL *polynomials = (POLYNOMIAL *)malloc(sizeof(POLYNOMIAL) * 8);
// 8 being the max number of polynomials I wan to store

ここで2つの質問があります。いつ、どのように用語配列にメモリを動的に割り当てる必要がありますか?空の用語配列のcallocメモリを保持するポインタへのポインタを作成することを考えていました。これはプログラムの開始時に行われますが、多項式の割り当て後に行われます(私は思います)。

別の質問ですが、メモリを解放する場合、プログラムが終了する前にプログラムの最後でこれを実行する必要があります。解放する順序はボトムアップである必要がありますか?つまり、用語配列を解放してから、多項式配列を解放します。

この時点で、ヒントやガイダンスが役立ちます。ありがとう!

4

3 に答える 3

2

で簡単に割り当てることができます

TERM *terms = calloc(20, sizeof(TERM));

構造体宣言内で直接行うことはできないため、これから行うことは次のようになります。

POLYNOMIAL *polynomials = calloc(size, sizeof(POLYNOMIAL));

for (int i = 0; i < size; ++i)
  polynomials[i].terms = calloc(20, sizeof(TERM));

はい、メモリをボトムアップで解放する必要があります。最初にすべての用語を解放し、次にの配列を解放しますPOLYNOMIALS

于 2012-04-05T22:19:18.857 に答える
1

まず、polynomial構造体は次のようになります。

typedef struct polynomial {
   int size;
   TERM *terms;
} POLYNOMIAL;

次に、構造体ごとに次のpolynomialようにします。

p.terms = calloc(size, sizeof(*terms));

terms構造体を解放する前に、が指すメモリを解放する必要があります。そうしないと、メンバーpolynomialにアクセスできなくなるためです。terms

于 2012-04-05T22:21:19.523 に答える
0

あなたの質問は宿題のタグが付けられているので、正確には教えません。

TERM terms[20]リテラルのインプレース配列です。関数でそのような変数を宣言した場合、その数の配列要素のためにスタック上のスペースを正確に予約します。構造内でそれを行うと、構造自体の内部にスペースが残ります。X x[n]そのため、配列構文にも使用される同等のポインタ構文に何かを変更するように求められました。

すでに書いているPOLYNOMIAL * polynomialsので、これは(a)単一の多項式へのポインター、または(b)多項式の配列へのポインターの両方であり、malloc式を使用して初期化できることがわかります。

質問からすでに知っていることを使用すると、自分で直感的に理解するように求められていることが確実にわかります。term1つまたは複数の構造体を指すようにフィールドを書き換えることができTERMます。

于 2012-04-05T22:20:12.583 に答える