Возврат из несовместимого указателя типа C - PullRequest
1 голос
/ 02 мая 2011

Я все еще пытаюсь разобраться с указателями, структурами и malloc в C. Я пытаюсь использовать хеш-таблицу, используя связанные списки. Я получаю возврат из-за несовместимой ошибки типа указателя при попытке компиляции:

struct Mlist_head{
    struct Mlist_node *head;
    struct Mlist_node *tail;
};

struct MList {
    int size;
    struct Mlist_head hashtable[HASHSIZE];
};

MList *ml_create(void){ 

    struct MList *m;
    struct Mlist_head *h;
    int i;

    if ((m = (struct MList *)malloc(sizeof(struct MList))) != NULL){
        if ((h = (struct Mlist_head *)malloc(sizeof(struct Mlist_head))) != NULL) { 
            for (i = 0; i < HASHSIZE; i++) {
                h = &(m->hashtable[i]);
                h->head = NULL;
                h->tail = NULL;
            }
            printf("worked");
            return m;
        }
    }
}

Я уверен, что здесь могут быть и другие ошибки (возможно, семантические), но по одной за раз:)

Спасибо за любую помощь

Ответы [ 2 ]

4 голосов
/ 02 мая 2011
MList *ml_create(void){ 

Должно быть

struct MList *ml_create(void){ 
1 голос
/ 02 мая 2011

В C объявление struct не вводит новый тип автоматически. Вам нужно использовать ключевое слово struct с именем, которое вы дали структуре (которая технически называется тегом структуры):

struct MList *ml_create(void);

Вы можете обойти это, определив имя нового типа, используя ключевое слово typedef:

typedef struct Mlist_head MList;

Теперь вы можете сделать:

MList ml_create(void);

Также:

По последним двум пунктам сравните ваш код:

if ((m = (struct MList *)malloc(sizeof(struct MList))) != NULL){

с этим, вот как я бы написал:

if ((m = malloc(sizeof *m)) != NULL) {

Для меня последнее намного легче читать, так как в нем меньше шума, и при этом оно безопаснее, поскольку не повторяет имя типа. Если тип указателя m позже изменится, моя версия по-прежнему будет на 100% правильной.

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