2010-11-30 15 views
1
//CHILD 
typedef struct Child{ 
    int id; 
}Child; 
Child* newChild(){ 
    Child *aChild = malloc(sizeof(Child)); 
    aChild->id = 0; 
    return aChild; 
} 

//PARENT 
typedef struct Parent{ 
    int id; 
    Child **children; 
}Parent; 

Parent* newParent(){ 
    Parent *aParent = malloc(sizeof(Parent)); 
    aParent->id = 0; 
    aParent->children = malloc(sizeof(Child*) * 5);//ARRAY OF 5 CHILDREN? 
    for(i=0; i<5; i++){ 
     aParent->children[i] = newChild(); 
    } 
    return aParent; 
} 

newParent()関数は、配列childrenを持つ構造体を作成する正しい方法ですか?私の主な関心事は、ラインです:mallocが実際に成功した場合c構造体の関係

aParent->children = malloc(sizeof(Child*) * 5); 

答えて

2

は、あなたがチェックする必要がありますが、それ以外の、コードはOKです。

0

Let_Me_Beによれば、原則としてコードに間違いはありません。しかし、私は私ができるならば、あなたはおそらくこれをやりたいと思っていることを指摘したいと思います:

Parent *p = newParent(); 

しかし、何が明らかでないことは、多くのメモリがちょうど割り当てられているということです。あなたがそれを追跡していない、またはそれを解放することを忘れた場合、あなたは問題があります。また、親のサイズを変更する必要がある子がいくつあるかわかりません。私はお勧めかもしれません:

typedef struct Parent{ 
    int id; 
    int numchildren; 
    Child **children; 
}Parent; 

と私は次のような機能を提案するかもしれません:あなたは、その後の関数を呼び出す

int parent_array_Initialise(Parent *p, int num_children) 
{ 
    p = malloc(sizeof(Parent)); 
    ... 
} 

int parent_array_children_resize(Parent *p, int new_children_size); 

int parent_array_Free(Parent *p); 

。 mallocの結果をテストできるように、それぞれの場合にmallocの結果(成功すれば のサイズ、失敗した場合は0)を返すことになります。

私の個人的な味です。あなたが何をするにしても、valgrindなどの結果を渡して、メモリが漏れていないことを確認してください。

関連する問題