【问题标题】:Passing argument from incompatible pointer type warning从不兼容的指针类型警告中传递参数
【发布时间】:2011-01-10 18:02:35
【问题描述】:

我今天大部分时间都在尝试找出 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 *) 到底做了什么......

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

【问题讨论】:

  • ListCount 接受 LIST 吗?什么是列表?它在哪里定义?你通过它 LIST*
  • 如果您没有typedef 指针类型,代码会更容易阅读/调试。
  • 从我有限的理解来看,LIST 是一个指向结构体的指针,叫做 Listhead。我说的对吗?
  • @hora:typedef struct listhead LISTtypedef struct listhead *LIST 之间存在差异。第一种情况LISTstruct listhead的同义词,第二种情况是struct listhead *的同义词。
  • @hora:很多人(包括我在内)都认为从不 typedef 去掉指针是个好主意,只需 typedef 结构。隐藏星号是个坏主意,因为它通常会在您使用该类型时突然出现,而且只会令人困惑。

标签: c pointers


【解决方案1】:

您会因为多个 typedef 而感到困惑。 LIST 是一种表示指向 struct listhead 的指针的类型。因此,您希望您的 ListCreate 函数返回 LIST,而不是 LIST *

LIST ListCreate(void)

上面说:ListCreate() 函数将返回一个指向新列表头部的指针。

然后你需要将函数定义中的return语句从return &amp;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;
}

【讨论】:

  • 喔喔喔喔好的,我明白发生了什么事。 @unwind 上面的评论帮助我理解了我在使用 typedef 做什么。所以我想我让 LIST 成为 typedef 中结构的指针,然后当我试图创建一个指针时,事情并不开心。我改变了工作方式,所以现在我很确定我最终得到了与您的建议相同的内容,只是以一种不那么令人困惑的方式编写。谢谢!
  • 是否可以强制将此警告报告为错误?
猜你喜欢
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多