C 编译错误:请求非结构或联合中的成员
编辑:以下代码已被修改,以便在问题解决后正常工作 具体来说,C 编译错误:请求非结构或联合中的成员,c,linked-list,random-access,C,Linked List,Random Access,编辑:以下代码已被修改,以便在问题解决后正常工作 具体来说,(*hardwareList.next\u item)->next最初是在没有括号的情况下编写的(例如,*hardwareList.next\u item->next),编译器不理解它 我试图弄明白为什么编译器会和我的C代码混淆。我试图创建一个链表来存储所有的项目,同时还创建一个指向最后一个“next”变量地址的指针,以便于附加 typedef struct { int recordNum; char toolName[25];
(*hardwareList.next\u item)->next
最初是在没有括号的情况下编写的(例如,*hardwareList.next\u item->next
),编译器不理解它
我试图弄明白为什么编译器会和我的C代码混淆。我试图创建一个链表来存储所有的项目,同时还创建一个指向最后一个“next”变量地址的指针,以便于附加
typedef struct {
int recordNum;
char toolName[25];
int quantity;
float cost;
} HardwareData;
typedef struct _HardwareListItem{
HardwareData data;
struct _HardwareListItem* next;
} HardwareListItem;
typedef struct _HardwareList {
HardwareListItem* items;
HardwareListItem** next_item;
} HardwareList;
HardwareList readFromFile(FILE* fp)
{
char stopReading = 0;
HardwareList hardwareList = {0};
hardwareList.next_item = &hardwareList.items;
do {
*hardwareList.next_item = (HardwareListItem*)calloc(1, sizeof(HardwareData));
if (*hardwareList.next_item == NULL)
{
fprintf(stderr, "OOM Reading File\n");
fflush(stderr);
exit(EXIT_FAILURE);
}
if (fread(&((*hardwareList.next_item)->data), sizeof(HardwareData), 1, fp) != 1) {
free(*hardwareList.next_item);
*hardwareList.next_item = NULL;
stopReading = 1;
} else {
hardwareList.next_item = &((*hardwareList.next_item)->next);
}
} while(!stopReading);
return hardwareList;
}
编译器说:
line 31: error: request for member 'data' in something not a structure or union
line 36: error: request for member 'next' in something not a structure or union
hardwareList。下一项是HardwareListItem**
,因此操作符->
返回HardwareListItem*
,它显然不是一个结构
你使用了太多的指针,这很混乱。尽量简化您的代码,那里有大量的bug。我猜问题在于这段代码:*(hardwareList.next_item)->数据
next\u item
是指向指针的指针,因此我猜测编译器将其读取为*((hardwareList.next\u item)->数据)
这当然不起作用-指针在C中没有任何成员
请尝试(*(hardwareList.next_item))->data)
以获得正确的解引用顺序。编译器没有给出行号吗?错误的编译器…(hardwareList.next\u item)->next将不起作用,因为next\u item不是struct@QuentinUK:哎呀,我的坏朋友。我马上就要编辑了。@Aaron Digulla:编译器确实给出了行号,但它们和我复制的行号不匹配。。现在用新的行号编辑。在这种情况下,在粘贴的代码中添加注释,如包含错误消息:-)我尝试过简化(请参见上面的更新代码),但仍然非常混乱。感谢堆,这让我疯狂地思考我是如何弄错的。