编译错误:请求在非结构体或联合体中的成员

7

编辑:下面的代码已经被修改,并且问题已经解决。

具体而言,(*hardwareList.next_item)->next最初编写没有括号(例如,*hardwareList.next_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

1
编译器不给出行号?糟糕的编译器... - Aaron Digulla
(hardwareList.next_item)->next无法工作,因为next_item不是指向结构体的指针。 - QuentinUK
@QuentinUK:哎呀,我的错。我马上编辑一下。 - Adam M-W
@Aaron-Digulla:编译器确实给出了行号,但它们与我复制的内容不匹配。现在已编辑并附上新的行号。 - Adam M-W
在这种情况下,添加一个注释到粘贴的代码中,包含错误信息 :-) - Aaron Digulla
https://dev59.com/Y3I95IYBdhLWcg3wtwb4 - Gajendra K Chauhan
2个回答

8
我猜想问题出在这段代码上:*(hardwareList.next_item)->data next_item是一个指向指针的指针,所以我猜测编译器将其解读为*((hardwareList.next_item)->data),而这显然是无法运行的——在C语言中指针没有任何成员。
尝试使用((*(hardwareList.next_item))->data)来获取正确的解引用顺序。

非常感谢,这让我疯狂地思考我错了。 - Adam M-W

4

hardwareList.next_itemHardwareListItem**,所以对其使用运算符 -> 将返回 HardwareListItem*,显然它不是一个结构体。

你使用了过多的指针,这很令人困惑。尝试简化你的代码,那里有大量的错误。


我试图简化(请参见上面更新的代码),但仍然相当令人困惑。 - Adam M-W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接