从不兼容的指针类型警告传递参数

时间:2010-01-29 07:04:23

标签: c pointers

我一直试图在今天的大部分时间里找出C指针,甚至早先问过question,但现在我仍然坚持其他的东西。我有以下代码:

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 个答案:

答案 0 :(得分:5)

由于多个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;
}