我一直试图弄清楚这一段时间,但无法找到解决方案。我正在构建一个链表,当我尝试将列表作为指针传递给任何东西时,我得到一个错误:将指针解引为不完整类型。
这是我的结构声明
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{
...
};
并收到错误:请求非结构或联合的成员。 如果有人有任何想法,那就太棒了。
修改的
结构定义是/在一个单独的文件中的主函数而不是函数,我已经将定义移动到头文件。
答案 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;
看起来有问题。你应该分配内存来存储参数名称指向的字符串的副本吗?