gpt4 book ai didi

C -- (void*) 到 int

转载 作者:太空狗 更新时间:2023-10-29 15:25:05 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com