将指针解除引用到不完整类型链接列表 - C.

时间:2015-02-25 20:48:29

标签: c pointers struct linked-list typedef

我一直试图弄清楚这一段时间,但无法找到解决方案。我正在构建一个链表,当我尝试将列表作为指针传递给任何东西时,我得到一个错误:将指针解引为不完整类型。

这是我的结构声明

typedef struct listStruct{
 char *name;
 int size;
 boolean inRestStatus;
 list *next;
 }list;

以及许多不起作用的功能之一。

void addToList(list *l, char * name, int size){
list *tmp;
while(l->next != NULL){
        l = l->next;
        }
tmp = malloc(sizeof(list));
tmp->name = name;
tmp->size = size;
tmp->inRestStatus = NO;
tmp->next = NULL;
l->next = tmp;
}

和标题

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

typedef struct listStruct list;

我尝试将结构声明更改为

typedef struct listStruct list{
...
};

并收到错误:请求非结构或联合的成员。 如果有人有任何想法,那就太棒了。

修改

结构定义是/在一个单独的文件中的主函数而不是函数,我已经将定义移动到头文件。

2 个答案:

答案 0 :(得分:1)

显然,您已将结构声明放入某个实现文件中,并将错误的实现文件放在该文件中。

标题中包含的typedef声明

typedef struct listStruct list;

声明一个不完整的类型。你必须放置这个

typedef struct listStruct{
  char *name;
  int size;
  boolean inRestStatus;
  list *next;
} list;

进入标题或至少进入使用结构数据字段的同一实现文件。它现在在哪里?您必须详细描述您的文件结构。

答案 1 :(得分:1)

您似乎只在标题

中声明了typedef名称
typedef struct listStruct list;

因此模块所在的功能

void addToList(list *l, char * name, int size);

定义不知道结构的定义。

您必须在标题中包含结构定义,例如

typedef struct listStruct{
 char *name;
 int size;
 boolean inRestStatus;
 struct listStruct *next;
 }list;

可以在定义函数的模块中访问它。

考虑到这个方法

void addToList(list *l, char * name, int size){
list *tmp;
while(l->next != NULL){
        l = l->next;
        }
tmp = malloc(sizeof(list));
tmp->name = name;
tmp->size = size;
tmp->inRestStatus = NO;
tmp->next = NULL;
l->next = tmp;
}

也错了。例如l可以等于NULL可以吗?

也是简单的复制指针

tmp->name = name;

看起来有问题。你应该分配内存来存储参数名称指向的字符串的副本吗?