簡體   English   中英

C —(void *)轉換為int

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM