[英]C Dereference void* pointer
我是 C 新手,对于我的第一个项目,我需要实现一个基于数组的队列。
我希望我的队列能够保存任何类型的对象,因此我创建了一个 QueueElement 结构来保存指向任何类型对象的 void 指针。 我认为除了我无法从我的 QueueElement 结构中读取“位置”和“值”字段之外,一切都在工作。 当我尝试编译时出现以下错误。
错误:
Runnable.c: In function `main':
Runnable.c:10: error: dereferencing pointer to incomplete type
Runnable.c:11: error: dereferencing pointer to incomplete type
我很确定我只是没有正确投射。 任何帮助表示赞赏。
再次感谢,波奇
可运行文件
#include <stdio.h>
#include "Queue.h"
int main(void) {
int i = 9;
Queue q = CreateQueue();
QueueElement e = CreateQueueElement(&i);
Enqueue(q, e);
QueueElement f = Dequeue(q);
/* PROBLEM IS HERE */
printf("position: %d", f->position);
printf("value: %d", (int *)(f->value));
DestroyQueue(q);
return 0;
}
队列.h
#ifndef QUEUE_H
#define QUEUE_H
#include "QueueElement.h"
typedef struct QueueStruct *Queue;
Queue CreateQueue(void);
void DestroyQueue(Queue q);
void Enqueue(Queue q, QueueElement e);
QueueElement Dequeue(Queue q);
#endif
队列文件
#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) {
int i;
for(i = 0; i < q->size; i++) {
free(q->contents[i]);
}
free(q);
}
void Enqueue(Queue q, QueueElement e) {
if (q->size < QUEUE_SIZE) {
q->contents[q->size++] = e;
}
}
QueueElement Dequeue(Queue q) {
if (q->size > 0) {
return q->contents[--q->size];
}
return;
}
队列元素.h
#ifndef QUEUE_ELEMENT_H
#define QUEUE_ELEMENT_H
typedef struct QueueElementStruct *QueueElement;
QueueElement CreateQueueElement(void *v);
void DestroyQueueElement(QueueElement e);
int GetPosition(QueueElement e);
#endif
队列元素
#include <stdio.h>
#include "QueueElement.h"
struct QueueElementStruct {
int position;
void *value;
};
QueueElement CreateQueueElement(void *v) {
QueueElement e = malloc(sizeof(struct QueueElementStruct));
e->position = 0;
e->value = v;
return e;
}
void DestroyQueueElement(QueueElement e) {
free(e);
}
int GetPosition(QueueElement e) {
return e->position;
}
QueueElementStruct
的定义必须在 Runnable.c 中可见才能访问它的字段。 您可以将QueueElementStruct
放入可以包含在Runnable.c
和QueueElement.c
的标头中。 或者,您可以使用GetPosition
函数并添加GetValue
函数并使用Runnable.c
函数而不是直接字段访问。
在取消引用它之前,您必须将void *
回指向“真实”类型。 例如,如果您以int
开头,则可以获取其地址,并将其放入队列中。 要查看int
,您必须将其转换回int *
。 跟踪真实类型可能(通常是)非常重要(例如,创建您希望能够放入集合中的所有类型的枚举,并将这些类型之一与集合中的每个项目相关联)。
C++(例如)选择只将一种类型的对象放入任何给定集合是有原因的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.