2010-11-30 24 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; 
} 

La fonction newParent() est-elle une méthode correcte pour créer une structure avec un tableau enfants? Ma principale préoccupation est la ligne:c struct relations

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

Répondre

2

Vous devriez vérifier si malloc effectivement réussi, mais à part ça, le code est OK.

0

Comme le dit Let_Me_Be, il n'y a rien de mal en principe avec le code. Cependant, je voudrais souligner que si je peux vous êtes probablement désireux de le faire:

Parent *p = newParent(); 

Mais ce n'est pas évident est que beaucoup de mémoire vient d'être alloué. Si vous ne le suivez pas, ou si vous oubliez de le libérer, vous avez un problème. En outre, vous ne savez pas combien d'enfants un parent a si vous souhaitez le redimensionner. Je pourrais suggérer:

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

et je pourrais proposer des fonctions telles que:

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); 

Vous appelez ensuite les fonctions. L'idée serait de retourner le résultat du malloc (taille du tableau si succès, 0 si échec) dans chaque cas afin que vous puissiez tester le résultat malloc.

Juste mon goût personnel. Quoi que vous fassiez, passez les résultats à travers valgrind ou similaire juste pour vous assurer que vous ne fuyez pas la mémoire.