c - 不兼容的指针类型 - 为什么?

标签 c

我试图了解 queue (3) 的内部运作方式Freebsd 中的宏。我以前问过question关于同一主题,这是一个后续问题。

我正在尝试定义一个函数来将元素插入队列。 queue (3)提供了宏STAILQ_INSERT_HEAD,它需要一个指向队列头的指针、队列中项目的类型以及要插入的项目。我的问题是我得到了

stailq.c:31: warning: passing argument 1 of 'addelement' from incompatible pointer type

当我尝试将 head 的地址传递给函数时出错。完整源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/queue.h>

struct stailq_entry {
        int value;
        STAILQ_ENTRY(stailq_entry) entries;
};

STAILQ_HEAD(stailhead, stailq_entry);

int addelement(struct stailhead *h1, int e){
        struct stailq_entry *n1;
        n1 = malloc(sizeof(struct stailq_entry));
        n1->value = e;
        STAILQ_INSERT_HEAD(h1, n1, entries);
        return (0);
}
int main(void)
{
        STAILQ_HEAD(stailhead, stailq_entry) head = STAILQ_HEAD_INITIALIZER(head);
        struct stailq_entry *n1;
        unsigned i;
        STAILQ_INIT(&head);                     /* Initialize the queue. */

        for (i=0;i<10;i++){
                addelement(&head, i);
        }
        n1 = NULL;

        while (!STAILQ_EMPTY(&head)) {
                n1 = STAILQ_LAST(&head, stailq_entry, entries);
                STAILQ_REMOVE(&head, n1, stailq_entry, entries);
                printf ("n2: %d\n", n1->value);
                free(n1);
        }

        return (0);
}

据我所知,head 的类型为 struct stailhead 并且 addelement 函数也需要一个指向 struct 的指针尾头

STAILQ_HEAD(stailhead, stailq_entry); 扩展为:

struct stailhead {
  struct stailq_entry *stqh_first;
  struct stailq_entry **stqh_last; 
};

我在这里缺少什么?

谢谢。

最佳答案

您只需将 main 函数中的第一行转换为

STAILQ_HEAD(stailhead, stailq_entry) head = STAILQ_HEAD_INITIALIZER(head);

struct stailhead head = STAILQ_HEAD_INITIALIZER(head);

发生的事情是,STAILQ_HEAD 是一个定义新类型的宏,该结构是您的数据结构,其第一个参数的名称和第二个参数的条目类型。

您只需调用 STAILQ_HEAD 一次来定义结构的类型 - 然后您可以使用该类型名称来创建该类型的新数据结构。

您在代码示例中所做的事情很简单:您定义了一个名为 stailhead 的结构两次 - 一次在全局范围内,一次在 main 函数的范围内。然后,您将指向本地 stailhead 的指针传递给接受具有相同名称的全局类型的函数。

尽管两个结构体相同,但它们位于两个不同的存储范围中,并且编译器将它们视为不同的类型。它警告您正在从 main::stailhead 类型转换为 global::stailhead 类型(请注意,我刚刚编造了这个符号,我不相信它是佳能)。

您只需在已执行的文件顶部调用 STAILQ_HEAD 宏一次来定义 stailhead,然后使用 struct stailhead 定义此类型的对象。

关于c - 不兼容的指针类型 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10039650/

相关文章:

c - C 中 fork() 的父级和子级

c - 如何将无符号长整数转换为字符串

c - 如何在 c 中使用带参数的函数指针?

c - 我的代码中某个测试用例的奇怪行为

c - 基本凯撒法典;加密字符串。请解释我做了什么:D

c - protected 内存区域上的 write() 不会触发 sigsegv,但标准访问会触发

c - 在 C 中读取行并将行分隔到链表中

c - 使用指针将数据分配给结构成员的字符数组

c++ - 在 C++ 应用程序代码中链接外部定义的静态函数

c - 编译时获取结构指针警告的 -Win兼容指针类型