реализация узла с использованием typedef против не использования typedef - PullRequest
0 голосов
/ 01 ноября 2018

Я не уверен, что понял концепцию typedef ... Скажем, есть два разных способа реализации узлов: один использует typedef, а другой не использует typedef. Например:

Существует узел, который был реализован следующим образом: где файл с именем node1.c выглядит следующим образом:

struct node_int {
  int value;
  node next;
};
void init_node(node *n, int value) {
    node new_node = (node)malloc(sizeof(struct node_int));
    //some code for initializing
}

и в node1.h , который выглядит следующим образом:

struct node_int;
typedef struct node_int *node;

и есть узел, который был реализован следующим образом: где файл с именем node2.c выглядит следующим образом:

struct node_int {
    int value;
    struct node *next;
};

void init_node(node_int **n, int value) {
    struct node_int* new_node = (struct node_int*)malloc(sizeof(struct node_int));
    //some code for initializing
}

и в node2.h , который выглядит следующим образом:

struct node_int;

Эти две реализации эквивалентны? и правильно ли используется malloc в каждом случае? Любое просвещение будет оценено.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Скрытие указателей за typedefs, например в typedef struct node_int *node;, подвержено ошибкам и сбивает с толку многих программистов. Вы должны избегать этого. Вы можете просто использовать один и тот же идентификатор для тега struct и typedef:

typedef struct node node;

struct node {
    int value;
    node *next;
};

node *init_node(int value) {
    node *np = malloc(sizeof(*np));
    if (np != NULL) {
        np->value = value;
        np->next = NULL;
    }
    return np;
}
0 голосов
/ 01 ноября 2018

Ниже, пожалуйста, проверьте, должен ли struct node быть struct node_int для следующего. Просьба компилировать и исправлять ошибки, вы можете получить представление об этом.

struct node_int{ int value; struct node *next; }

...