Передача аргумента из несовместимого предупреждения типа указателя

Я пытался найти указателей на 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  #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 *) действительно делает …

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

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

 LIST ListCreate(void) 

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

Затем вам нужно изменить оператор return в определении функции из return &headpoolp-1; return headpoolp-1; , Это связано с тем, что вы хотите вернуть последний ansible указатель на голову, и вы только что 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; }