C:取消引用指向不完整类型单链表的指针

C: dereferencing pointer to incomplete type singly linked list

list.h

#ifndef LIST_H
#define LIST_H

/* Function prototypes */
struct nodeStruct* List_createNode(int item);
#endif

list.c

#include <stdio.h>
#include <stdlib.h>

struct nodeStruct {
    int item;
    struct nodeStruct *next;
};
struct nodeStruct* List_createNode(int item) {
    struct nodeStruct *node = malloc(sizeof(struct nodeStruct));
    if (node == NULL) {return NULL;}
    node->item = item;
    node->next = NULL;
    return node;
}

Main.c:

#include "list.h"
#include <assert.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

struct nodeStruct *one = List_createNode(1);
while(one != NULL) {
    printf("%d", one->item); //error
    one= one->next; //error
}

错误:error: dereferencing pointer to incomplete type printf("%d", one->item); 错误在 one->item,我尝试了几种组合来取消引用,但似乎不起作用。什么是正确的方法?

已更新:

list.h

#ifndef LIST_H
#define LIST_H

    struct nodeStruct {
    int item;
    struct nodeStruct *next;
};
/* Function prototypes */
struct nodeStruct* List_createNode(int item);
#endif

现在错误是,invalid application of ‘sizeof’ to incomplete type ‘struct nodeStruct’ struct nodeStruct *node = malloc(sizeof(struct nodeStruct)); 来自我的 list.c 文件。

我可以想到几个方法:

  1. struct的定义放在头文件中,#include将头文件放在main.c中。

  2. 添加几个函数

    int getNodeItem(struct nodeStruct* node)
    {
       return node->item;
    }
    
    struct nodeStruct* getNextNode(struct nodeStruct* node)
    {
       return node->next;
    }
    

    并调用 main 中的函数。

    while (one != NULL) {
       printf("%d", getNodeItem(one));
       one = getNextNode(one);
    }
    

list.c中添加#include "list.h"。当 gcc 尝试编译后者时,编译器的本地调用不知道 struct nodeStruct 因为它的定义尚未包含在本地文件中。

注意:这是基于您的更新,其中 struct nodeStructlist.h 中定义。