从不兼容的指针类型警告传递参数
问题描述:
我一直在试图弄清楚今天大部分时间里的指针,甚至在早些时候问过一个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 *)
真的...
任何帮助,将不胜感激,谢谢。
答
由于多个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;
}
ListCount接受LIST?什么是LIST?它在哪里定义?你通过它LIST * – 2010-01-29 07:08:42
如果你没有'typedef'指针类型,代码将更容易被读/调试。 – 2010-01-29 07:10:17
根据我的理解,LIST是一个指向名为Listhead的结构体的指针。我对吗? – hora 2010-01-29 07:11:55