我正在用 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/