我今天大部分时间都在试图找出 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/

10-16 20:23