【问题标题】:New to C: Storing Structures in an ArrayC 新手:将结构存储在数组中
【发布时间】:2011-01-28 02:49:15
【问题描述】:

我的第一个 C 任务是创建一个队列。我使用的是基于数组的实现,而不是链表。

当我尝试编译我的代码时出现以下错误:

Queue.c: In function 'Enqueue':
Queue.c:23: warning: assignment from incompatible pointer type

这是我的代码,如果需要,我会提供标头代码:

#include "QueueElement.h"
#include "Queue.h"

#define QUEUE_SIZE 10

struct QueueStruct {
        QueueElement *contents[QUEUE_SIZE];
        int size;
};

Queue CreateQueue(void) {
        Queue q = malloc(sizeof(struct QueueStruct));
        q->size = 0;
        return q;
}

void DestroyQueue(Queue q) {
        free(q);
}

void Enqueue(Queue q, QueueElement *e) {
        if (q->size < QUEUE_SIZE) {

                q->contents[q->size++] = *e;        /* PROBLEM IS HERE */

        }
}

非常感谢您对此问题的任何帮助以及任何其他建议。 谢谢大家。

【问题讨论】:

  • 这似乎是深奥的指针符号用法。您试图取消对 e 的引用,从而将 e 的值(它是一个几乎任何大小的连续内存块)复制到一个指针(通常是 4 个字节)中。东西不合适,即使尺寸匹配,QueueElementQueueElement* 也不一样。
  • Queue 是什么?您提供的代码中没有Queue 的定义。

标签: c arrays structure


【解决方案1】:

我相信你的意思

q->contents[q->size++] = e;

(没有星号) 因为您将 QueueElement* 类型的东西分配给 QueueElement*[] 数组。

或者您可以通过更改它来修复它 - 这可能更接近我认为您可能的意思:-

QueueElement contents[QUEUE_SIZE];

不确定这是否有意义/我完全正确。

【讨论】:

    【解决方案2】:

    我认为q-&gt;contents[q-&gt;size++] = *e; 应该只是q-&gt;contents[q-&gt;size++] = e;

    * 取消引用指向内存位置实际值的指针,我不认为你想要那个——你想要指针。

    【讨论】:

    • 就是这样。程序现在编译。再次感谢大家的快速回复。 (等待标记为已回答)
    • 太棒了!作为后续,我发现本指南对我学习 C 中的指针非常有用:pw1.netcom.com/~tjensen/ptr/pointers.htm。它有 50 页长,教你指针、引用、解除引用和数组如何在 C 中工作的基础知识。非常值得一读。
    【解决方案3】:

    *eQueueElement 类型,q-&gt;contents[q-&gt;size++]QueueElement*

    您应该在 e 之前删除 * 或将内容声明为:

        QueueElement contents[QUEUE_SIZE];
    

    这取决于您是否尝试存储指针或值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多