[英]C — (void*) to int
我正在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
在函數末尾超出范圍,因此基本上您隊列中的所有節點都指向無效的內存。
如果“彈出”操作的功能不同:
該問題可能是因為您要將局部變量推入隊列中。
當您彈出時,該地址不再有效(或至少不指向int值),因此您正在打印一些奇怪的東西。 由於數據不再指向您的int,它可能看起來像一個內存地址。
您是在設置data = int_data
(即data = int_data
> void *)還是data = &int_data
(即int *-> void *)? 在前一種情況下,您必須編寫printf("pop data (100): %d\\n", pop_data);
您可以使用glib GPOINTER_TO_INT宏:
#define GPOINTER_TO_INT(p) ((gint) (glong) (p))
但是,請注意文檔說明:
您可能不會在實體店中存儲指針。 此內容不以任何形式或形式移植。 這些宏僅允許將整數存儲在指針中,並且僅保留整數的32位。 超出32位整數范圍的值將被破壞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.