我今天大部分时间都在试图找出 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 *)
到底做了什么......任何帮助将不胜感激,谢谢。
最佳答案
由于多个 typedef,您会感到困惑。 LIST
是一种表示指向 struct listhead
的指针的类型。因此,您希望 ListCreate
函数返回 LIST
,而不是 LIST *
:
LIST ListCreate(void)
上面说:如果可以,
ListCreate()
函数将返回一个指向新列表头部的指针。然后需要将函数定义中的
return
语句从 return &headpoolp-1;
改为 return headpoolp-1;
。这是因为您想返回最后一个可用的头指针,并且您刚刚增加了 headpoolp
。所以现在你想从中减去 1 并返回它。最后,您的
main()
需要更新以反射(reflect)上述更改:int main(void)
{
/* Make a new LIST */
LIST newlist; /* a pointer */
newlist = ListCreate();
int i = ListCount(newlist);
printf("%d\n", i);
return 0;
}
关于c - 从不兼容的指针类型警告传递参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2160421/