我有一个通用链表,如下所示:
队列.hpp
typedef struct queue_node
{
struct queue_node *next;
struct queue_node *prev;
void *data;
int32_t index;
} queue_node;
typedef struct queue
{
struct queue_node *head;
struct queue_node *tail;
struct queue_node *current;
int32_t max_entries;
int32_t num_entries;
} queue;
我认为这很简单,但我很难使用 void *data 来处理任意参数(通常是在其他地方定义的自定义对象)。当我从节点中提取数据时,我尝试将其转换为所需的对象。在这种情况下,我尝试转换为 proc_instruction 来读回我存储在那里的数据 -> 段错误:
procsim.cpp:
while (total_instructions < 5000 && fscanf(proc_tf, "%x %d %d %d %d\n",
&p_inst->address,
&p_inst->type,
&p_inst->dst,
&p_inst->src[0],
&p_inst->src[1]) != EOF) {
trace_queue = append_node(trace_queue,p_inst); // stores p_inst in new trace_queue node
trace_queue->current = goto_queue_first(trace_queue);
p_inst = (proc_instruction*)trace_queue->current->data; // trying to get stored inst from trace_queue node
printf("%x %d %d %d %d\n",p_inst->address,p_inst->type, p_inst->dst, p_inst->src[0], p_inst->src[1]);
}
这是我附加数据的位置(如果有帮助的话):
队列.cpp
queue *append_node(queue *app_q, void *app_data)
{
if(!queue_is_empty(app_q))
app_q->current = goto_queue_last(app_q);
queue_node *n = (queue_node *)emalloc(sizeof(*n));
n->prev = app_q->current;
n->next = app_q->tail;
app_q->current = goto_queue_last(app_q);
app_q->current->data = app_data;
app_q->num_entries++;
app_q->current->index = app_q->num_entries;
return app_q;
}
我看过人们这样做的示例代码,但我似乎无法理解。我一定犯了一个根本性的错误。谢谢伙计们/女孩们。
最佳答案
似乎queue_node *current在“append_node”中不是必需的,因为您想将新节点追加到尾部。
而且我没有看到“app_q”的初始化,我假设 memset(0) 在分配时被调用。
queue *append_node(queue *app_q, void *app_data)
{
queue_node *n = (queue_node *)emalloc(sizeof(*n));
memset(n, 0, sizeof(queue_node));
if ( NULL == app_q->head)
{
app_q->head = n;
app_q->tail = n;
}
else
{
n->prev = app_q->tail;
n->next = NULL;
app_q->tail->next = n;
app_q->tail = n;
}
n->data = app_data;
n->index = app_q->num_entries;
return app_q;
}
关于c - 在链接列表中使用 "void *"时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21871395/