【发布时间】:2011-06-28 01:07:27
【问题描述】:
我正在用 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;
}
【问题讨论】:
-
根据您提供的信息,我认为我们没有足够的信息来回答您的问题;只要您正确设置了所有内容,这应该可以正常工作。程序实际打印的是什么?您能否提供更多有关这些功能如何工作的背景信息?
-
只要说
printf("...", popped->data);就行了 -
您正在存储一个局部变量的地址,一旦它从堆栈中弹出,您的
void* data将指向垃圾内存。