c - 在链接列表中使用 "void *"时出现问题

标签 c generics casting linked-list void

我有一个通用链表,如下所示:

队列.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/

相关文章:

c - 数组指针到数组的转换 - C/C++ 初学者

javascript - 为什么 JavaScript 坚持将 float 转换为整数?

c - C 语言中从整数中提取最后一个值并转换为字符

c - 如何使用 C 在 SDL2 中移动矩形

java - 将现有泛型转换为菱形语法

java - 减少类型参数

c# - 如何使用反射通过构造函数强制转换为对象?

c - 如何将两个灵活数组放入一个结构中?

c - fscanf - 使用太长的字符串

swift - Swift 中 X 的通用集合?