Как говорит 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 (размер
массив в случае успеха, 0 в случае неудачи) в каждом случае, чтобы вы могли проверить результат malloc.
Просто мой личный вкус. Что бы вы ни делали, передайте результаты через valgrind или аналогичный, чтобы убедиться, что у вас нет утечки памяти.