2015-12-06 64 views
-1

我有以下的代碼塊:如何將指針轉換爲整數,反之亦然?

typedef Module * Ptr; 
producer(Ptr net) 
    Ptr Node; 
    Node = net; 
    pthread_mutex_lock(&mutex); 
    produce(q,(uint64_t)Node); 
    pthread_cond_signal(&cond); 
    pthread_mutex_unlock(&mutex); 

這裏產生是一個庫: 農產品(隊列Q,uint64_t中值)

然後,我有消費者的代碼:

consumer() 
    Ptr Node; 
    pthread_mutex_lock(&mutex); 
    while(!canConsume(q)) 
    { 
     pthread_cond_wait(&cond,&mutex); 
    } 
    Node = (Ptr)consume(q); 
    pthread_mutex_unlock(&mutex); 

但是,當我嘗試在兩個函數中打印出modNode的值時。雖然生產者函數中的節點似乎是地址,但消費者函數中的節點似乎爲0.我認爲我以某種方式搞亂了指針和整數之間的轉換,因爲此代碼可以在傳遞整數時正常工作。我的問題是如何將指針轉換爲uint64_t?

+0

什麼是q?你自己寫了「消費」和「生產」嗎?你確定'消費'或'生產'沒有錯誤嗎? – immibis

+3

問題可能是您不知道每個將構建的平臺上的實際指針大小。因此,儘可能使用['(u)intptr_t'](https://en.wikibooks.org/wiki/C_Programming/C_Reference/stdint.h#Integers_wide_enough_to_hold_pointers)。 – StoryTeller

+0

很難從你的帖子中知道,但是當你測試它時Node爲0,而0通常是C中NULL指針的值,我懷疑在某個階段你的consume()函數返回NULL。隊列可能是空的。 – StephenG

回答

0

的指針轉換爲uint64_t,使用類型轉換操作符:

(uint64_t)ptr 

打印時指針與printf,你要使用的%p格式化說明符:

printf("%p\n", (void*)ptr); 

不要忘了將ptr轉換爲void*,除非ptrvoid*char*或這些的合格變體。

+0

AFAICT,'printf(「%p \ n」,ptr)'很好[即無需強制轉換]即使使用'-Wall'和'ptr'是一個結構體指針 –

+0

不應該使用不同的整數類型來轉換指針,而不是使用'(u)intptr_t'。任何其他整數不保證指針值保持不變。 – Olaf

+1

@CraigEstey:對於可變參數函數,您必須投射指針。這是規則中唯一的例外,從不在C中從'void *'指針指向/。如果編譯器不警告並不能保證你沒有問題(希望它很簡單)。 – Olaf

相關問題