【问题标题】:Why am I getting left of '->head' must point to struct/union when it is pointing to another structure?为什么当'->head'指向另一个结构时,我必须指向结构/联合?
【发布时间】:2018-11-10 03:28:44
【问题描述】:

当 head 指向一个结构时,试图找出我收到此错误的原因。看起来 head 指向 QNODE 长度。为什么不呢?

typedef struct Qnode QNODE;
struct Qnode
{
   int length;
   QNODE* next;
};
typedef struct lqueue lQUEUE;
struct lqueue
{
    QNODE *head;
    QNODE *tail;
};

 lQUEUE lqueue_init_default(void)
{
   lQUEUE* pQ = NULL;
   pQ = (lQUEUE*)malloc(sizeof(lQUEUE));
   pQ->head->length = NULL;
   pQ->tail->length = NULL;
   pQ->head->next = pQ->tail;
   return *pQ;
}

【问题讨论】:

  • lqueue_init_default() 应该返回 lQUEUE*,而不是 lQUEUE。不管怎样,pQ->headpQ->tailmalloc() 之后的值是多少?
  • briduss,pQ = (lQUEUE*)malloc(sizeof(lQUEUE));之后,pQ->head的值是多少?
  • ... 每次你在 C 中使用 *alloc() 的结果时,一只小猫就死了:(
  • 上面的代码不会产生你所说的错误信息。请使用minimal reproducible example 更新您的问题,其他人可以按原样编译以重现您的问题。还包括您收到的确切错误消息。

标签: c struct queue


【解决方案1】:

对于这种 queue 样式,lQUEUE lqueue_init_default(void) 返回一个 结构

不幸的是,OP 的代码正在为结构分配内存,然后返回内存的副本。这会丢失指向已分配对象的原始指针。

此外,pQ->head->length 取消引用 pQ->head,即使成员 head 尚未分配。当然,这就是“'->head' 的左侧必须指向结构/联合”的原因,因为 OP 的运行时确定了 pQ->head 的无效性。


如何解决取决于未说明的编码目标。

为了匹配lQUEUE lqueue_init_default() 的明显意图,分配lQUEUE 结构的成员并返回它的副本。

 lQUEUE lqueue_init_default(void) {
   lQUEUE lQ;
   lQ.head = malloc(sizeof *(lQ.head)); // allocate memory for a QNODE, not lQUEUE
   // If allocation successful ...
   if (lQ.head) {
     lQ.head->length = 0;
     lQ.head->next = NULL;
   }
   lQ.tail = lQ.head;  // start with head & tail pointing to the same `QNODE`.
   return lQ;
}

lqueue_init_default() 的另一种形式可以简单地将head, tail 分配给NULL。这取决于未说明的其他编码目标。

 lQUEUE lqueue_init_default(void) {
   lQUEUE lQ;
   lQ.head = NULL;
   lQ.tail = lQ.head;  // start with head & tail pointing to the same `QNODE`.
   return lQ;
}

示例用法

lQUEUE myQ = lqueue_init_default(void);

我发现这仍然是 queue 浪费而且没那么有用。 queue 不需要一个指向 head 和 tail 的指针在 O(1) 时间内添加到两端。

【讨论】:

  • calloc() 会更便宜。
  • @Swordfish 也许吧。任何一种方法都是 O(1) 时间。对我来说,lqueue_init_default(void) 主体应该只是将 queue 的唯一成员设置为 NULL,但这是另一个 queue 范例。
【解决方案2】:

长度是整数。请不要使用指针值(NULL)并且不能期望指针的长度。有什么错误没有post中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    相关资源
    最近更新 更多