C -- (void*) 到 int

标签 c pointers queue

我正在用 C 为内核实现一个简单的优先级队列,所以我不能使用任何标准库。队列中有一个头节点,每个节点指向队列中的下一个节点。

typedef struct node node;
struct node {
    node *next;
    void *data;
};

typedef struct  {
    node *head;
    int n;
} queue;

如您所见,每个节点都将其数据保存在 void* 中。当我从堆栈中弹出数据时,我无法将此数据转换为 int。

//push data
int int_data = 100;
push(q, &int_data);
//...
//pop data
node* popped = pop(q);
int *pop_data = popped->data;
printf("pop data (100): %d\n", *pop_data);

为什么我这里获取不到原始值?我似乎在打印一个指针值。或者,有没有更好的方法来处理这个问题?

== 编辑(抱歉应该包括这些):

void push(queue *q, void *data)
{
    node new;
    new.data = data;
    node *new_ptr = &new;

    if(is_empty(q))
    {
        q->head = new_ptr;
        q->n++;
        return;
    }

    int i;
    node *curr = q->head;
    for(i=0; i<q->n; i++)
    {
        curr = curr->next;
    }
    curr->next = new_ptr;
    q->n++;
}

node* pop(queue *q)
{
    node *curr = q->head;
    q->head = curr->next;
    return curr;
}

最佳答案

您的代码是否都在一个函数中?如果不是,int int_data 将从堆栈中弹出(不是您的队列,实际的堆栈),这可能就是您打印垃圾的原因;您正在存储局部变量的地址。

我建议将 void* data 更改为 int data。 (如果需要,可以将地址存储在 int 中,稍后可以将其转换回指针。)

int int_data = 100;
push(q, int_data);

node* n = pop(q);
int num = n->data;

再次检查你的代码后,你在添加新节点时遇到了同样的问题。 node new 在函数末尾超出范围,因此基本上队列中的所有节点都指向无效内存。

关于C -- (void*) 到 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5011537/

相关文章:

C - 在带有指针的结构的循环中进行 malloc

c - 将字符串分配给指针时,它是否保留空间内存

c++ - 缓冲区的套接字队列问题

c - 为什么 malloc 在 gcc 编译器中将 o 作为默认值返回?

c - 在这段代码中,为什么 'ename' 应该是 char 指针类型而不是 char 数组?

c - Misra 和位操作

c - 动态内存指针

java - 使用链表排队

ios - Objective-C dispatch_after 有时会早于指定时间执行

c - 在C中将嵌套结构写入磁盘