Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编译错误:请求非结构或联合中的成员_C_Linked List_Random Access - Fatal编程技术网

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:编译器确实给出了行号,但它们和我复制的行号不匹配。。现在用新的行号编辑。在这种情况下,在粘贴的代码中添加注释,如包含错误消息:-)我尝试过简化(请参见上面的更新代码),但仍然非常混乱。感谢堆,这让我疯狂地思考我是如何弄错的。