2012-04-05 34 views
0

他の構造体内の構造体の配列に動的にメモリを割り当てる方法がわかりません。で、ここで私の問題です...私は主を含むproject.cファイルを持って、私は、数のように多項式を掛ける項を追加するようなすべてのポリ操作を処理する別のpolynomial.cファイルがあります..構造体内の配列の動的メモリ割り当て

これは私が動的ポリ配列にメモリを割り当て、私のproject.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; 
... 
... 

のヘッダファイルです。

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

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

もう1つの質問、私はメモリを解放するときにこれが終了する前にプログラムの最後にこれを行う必要があります。言い換えれば、用語配列を解放し、次に多項式配列を解放します。

この時点で、ヒントや指針が参考になります。ありがとう!

答えて

1

あなたは単にあなたがそう何をやろうとしていること

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

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

のようなものである構造体宣言内で直接それを行うことはできませんそして、はい、あなたは意志

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

でそれを割り当てることができますメモリをボトムアップする必要があります。まず、すべての条件を解放してから、POLYNOMIALSの配列を解放します。

+3

彼は彼のために宿題をする資格があります。それを解決するのではなく、彼のためにそれをしないで解決策に導く方が良いのではないでしょうか? –

+0

*用語のcallocをいつ、どこで呼び出す必要がありますか? – Hall9

+0

主なことは、使用している多項式が有効なポインタを指していることです。そうでなければ、メンバーを割り当てることができません。 – Jack

0

あなたの質問は宿題にタグ付けされているので、私はあなたに正確に言わないでしょう。

TERM terms[20]は、リテラルインプレースアレイです。関数内でそのような変数を宣言した場合は、その配列要素の数だけスタック上のスペースを正確に確保します。それを構造内で実行すると、構造自体の内部にスペースが残ってしまいます。だから、X x[n]からそれと同等のポインタ構文に変更するように頼まれました。これは配列構文にも使われます。あなたは既にPOLYNOMIAL * polynomialsを書かれている

ので、あなたは、これは多項式の配列に単一の多項式に(a)のポインタ、または(b)のポインタの両方であることを知って、あなたはmalloc式を使用して、それを初期化することが可能となります。

質問から既に知っていることを使用している場合は、確かにあなたはあなた自身のために直感的に求められているものを見ることができます。フィールドtermを、1つを指すような方法で、または複数のTERM構造体を書き換えることができます。

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

次に、あなたが持っている各polynomial構造体のために:あなたのpolynomial構造体は次のようになります開始のために

0

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

あなたがメモリを解放する必要がありますが無料あなたの前termsで指さそれ以外の場合はtermsメンバーにアクセスすることは許可されないため、polynomial構造体を使用してください。

関連する問題