c структурировать отношения - PullRequest
1 голос
/ 30 ноября 2010
//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 () правильным способом создания структуры с дочерними массивами?Моя главная забота - линия:

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

Ответы [ 2 ]

2 голосов
/ 30 ноября 2010

Вы должны проверить, действительно ли malloc успешно, но кроме этого, код в порядке.

0 голосов
/ 30 ноября 2010

Как говорит 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 или аналогичный, чтобы убедиться, что у вас нет утечки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...