【问题标题】:Receiving error - request for member ****** in not a structure or union接收错误 - 请求成员 ****** 不是结构或联合
【发布时间】:2013-10-05 00:27:05
【问题描述】:

我正在 C 中创建一个通用队列,并且收到标题错误。我的 Queue.c 文件中的函数旨在接收初始化的指针。

这是我的结构代码:

struct QueueNode {

   struct QueueNode *prev;
   struct QueueNode *next;

};

typedef struct QueueNode QNode;

struct Queue {

    QNode front;
    QNode rear;
};

typedef struct Queue Q;

然后在我的队列初始化函数中,我得到了错误。这是我的功能:

void Q_Init(Q* const pointerQ){

    assert (pointerQ != NULL);   

    pointerQ.front->prev = NULL;
    pointerQ.front->next= pointerQ.rear;
    pointerQ.rear->prev = pointerQ.front;
    pointerQ.rear->prev = NULL;
}

我不完全确定为什么会出现错误。我认为由于 Queue 有 Node 成员而不是指针,我必须使用 pointerQ.front/rear 来访问它们,然后由于 Node 有指针成员,我然后使用 ->next/rear。

任何帮助将不胜感激!

提前致谢!

【问题讨论】:

  • 很确定你的节点中应该有某种数据成员。
  • 感谢编辑!我会投票,但我确实有足够的代表

标签: c struct


【解决方案1】:

你的事情完全倒退了。左边是结构体还是指向结构体的指针决定是否使用'.'。或 '->' 不是右边的内容。

在你的例子中,pointerQ 是一个指向结构的指针,所以你使用'->'来访问它的字段:

pointerQ->front
pointerQ->rear

由于 front 和 back 是结构实例,而不是指针,因此您可以使用 '.' 访问它们的字段:

pointerQ->front.prev = NULL;
pointerQ->front.next = pointerQ->rear;
pointerQ->rear.prev = pointerQ->front;
pointerQ->rear.next = NULL;

一旦您解决了第二次和第三次分配可能会出错的问题,因为左侧是 struct QueueNode * 而右侧是 Qnode(它是 struct QueueNode)。

要解决此问题,您需要:

pointerQ->front.next = &(pointerQ->rear);
pointerQ->rear.prev = &(pointerQ->front);

取前后地址。

【讨论】:

  • 我更改了它,现在出现错误:从 QNode 类型分配给类型 struct QueueNode* 时类型不兼容。
  • 谢谢!这解决了它。
【解决方案2】:

pointerQ.front 等等应该是pointerQ->front,因为pointerQ 顾名思义就是一个指针。

【讨论】:

    【解决方案3】:

    是否必须使用. 运算符或-> 运算符取决于运算符左侧的位置,而不是右侧的位置。

    您的pointerQ 是一个指针。不能将. 运算符与指针一起使用,您必须使用->*. 组合。

    同时,您的frontrear 成员的情况正好相反。这些成员不是指针。它们被声明为struct QueueNode 类型的对象。您不能将它们与-> 运算符一起使用。你必须使用. 操作符来访问他们的内部结构。

    例如,这是一个有效的成员访问语法pointerQ->front.prev。这也是有效的(*pointerQ).front.prev。您的代码中的内容无效。

    【讨论】:

    • 我更改了它,现在出现错误:从 QNode 类型分配给类型 struct QueueNode* 时类型不兼容
    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多