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

问题描述:

我一直在试图弄清楚今天大部分时间里的指针,甚至在早些时候问过一个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 *)真的...

任何帮助,将不胜感激,谢谢。

+0

ListCount接受LIST?什么是LIST?它在哪里定义?你通过它LIST * – 2010-01-29 07:08:42

+0

如果你没有'typedef'指针类型,代码将更容易被读/调试。 – 2010-01-29 07:10:17

+0

根据我的理解,LIST是一个指向名为Listhead的结构体的指针。我对吗? – hora 2010-01-29 07:11:55

由于多个typedefs,你会感到困惑。 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; 
} 
+0

Ohhhh哇,好吧,我明白发生了什么事。上面的@ unwind的评论帮助我理解了我在使用typedef时所做的事情。所以我认为我让LIST指向了typedef中的结构体,然后当我尝试创建一个指针时,事情并不快乐。我改变了这种方式,所以现在我很确定我最终得到了与您的建议相同的结果,只是以较不混乱的方式编写而已。谢谢! – hora 2010-01-29 07:35:05

+0

此警告是否可以强制报告为错误? – Danijel 2016-12-02 13:14:16