Передача аргумента из предупреждения о несовместимом типе указателя - PullRequest
4 голосов
/ 29 января 2010

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

typedef struct listnode *Node;
typedef struct listnode {
    void *data;
    Node next;
    Node previous;
} Listnode;

typedef struct listhead *LIST;
typedef struct listhead {
    int size; 
    Node first;
    Node last; 
    Node current; 
} Listhead;

#define MAXLISTS 50

static Listhead headpool[MAXLISTS];
static Listhead *headpoolp = headpool;

#define MAXNODES 1000 

static Listnode nodepool[MAXNODES];
static Listnode *nodepoolp = nodepool;

LIST *ListCreate()
{
    if(headpool + MAXLISTS - headpoolp >= 1)
    {
        headpoolp->size = 0;
        headpoolp->first = NULL;
        headpoolp->last = NULL;
        headpoolp->current = NULL;
        headpoolp++;
        return &headpoolp-1; /* reference to old pointer */

    }else
        return NULL;
}

int ListCount(LIST list)
{
    return list->size;

}

Теперь в новом файле у меня есть:

#include <stdio.h>
#include "the above file"

main()
{
    /* Make a new LIST */
    LIST *newlist; 
    newlist = ListCreate();
    int i = ListCount(newlist);
    printf("%d\n", i);
}

Когда я компилирую, я получаю следующее предупреждение (оператор printf печатает то, что должен):

file.c:9: warning: passing argument 1 of ‘ListCount’ from incompatible pointer type

Должен ли я беспокоиться об этом предупреждении? Кажется, код выполняет то, что я хочу, но я, очевидно, очень озадачен указателями на C. После просмотра вопросов на этом сайте я обнаружил, что, если я сделаю аргумент ListCount (void *) newlist, я не получу предупреждение, и я не понимаю, почему и что (void *) на самом деле не делает ...

Любая помощь будет оценена, спасибо.

1 Ответ

5 голосов
/ 29 января 2010

Вы запутались из-за нескольких typedef. LIST - это тип, представляющий указатель на struct listhead. Итак, вы хотите, чтобы ваша ListCreate функция возвращала LIST, а не LIST *:

LIST ListCreate(void)

Выше сказано: ListCreate() функция вернет указатель на заголовок нового списка, если сможет.

Затем вам нужно изменить оператор return в определении функции с return &headpoolp-1; на return headpoolp-1;. Это потому, что вы хотите вернуть последний доступный указатель головы, и вы только что увеличили headpoolp. Итак, теперь вы хотите вычесть из него 1 и вернуть это.

Наконец, ваш main() необходимо обновить, чтобы отразить вышеуказанные изменения:

int main(void)
{
    /* Make a new LIST */
    LIST newlist;  /* a pointer */
    newlist = ListCreate();
    int i = ListCount(newlist);
    printf("%d\n", i);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...