0

我想知道什麼是使用簡單整數和memsize的正確方法?更確切地說,我有一個最初爲32位體系結構編寫的C代碼。現在,它已經運行到兩個架構,所以有明顯的理由得到以下警告,在64位架構上運行的使用簡單整數和memsize的正確方法

warning: cast to pointer from integer of different size 

我想刪除使用memsize個,intptr_tuintptr_t這些警告的同時。但是如果我們使用混合的簡單整數和memsize,我懷疑它是否正常工作。我想知道使用它的正確方法。以下是代碼示例。

compllits = list_Cons((POINTER) predindex, compllits); 

這裏compllits是一個鏈表並且被定義爲pointerlist_Cons返回指針。 list_Cons被定義爲:

list_Cons(POINTER x, LIST y); 

而且,int preindex。我將整型轉換爲指針。正如我在64位機上運行,​​我會得到警告

: warning: cast to pointer from integer of different size 

我們解決此警告,我在我使用這兩種方法混淆liitle位,

 Method 1: changing the int preindex into intptr_t preindex. 

    Method 2. Keeping int preindex unchanged but doing following 

     compllits = list_Cons((POINTER)(intptr_t)predindex, compllits); 

無論是方法正在工作。但我不確定哪種方法合法和最好? 尋找一些建議。

謝謝

+0

我正在使用** intptr_t **,以便根據基礎確定整數的大小的硬件架構,我不會得到我在問題中提到的警告。 – thetna 2011-04-22 17:28:31

回答

0

preindex真的是指針嗎?如果是這樣,那麼你的問題是使用int作爲指針類型。使用int *。

此外,我建議使用int *而不是intptr_t。 intptr_t是一個寬度足以容納一個指針的整數,但在語義上它仍然是一個整數。

在32位機上,int的寬度是32位,int *的寬度也是32位。在64位機器上,int仍然是32位寬,但是int *是64位寬。

+0

沒有preindex是**整數**。 – thetna 2011-04-22 17:51:31

2

最大的問題是如果你真的必須混合使用指針和整數。 (在這種情況下,少數情況是在處理類似於lisp的通用數據結構時)。如果不是,則應該使用正確的類型,並且僅使用該類型。

但是,如果是這樣的話,你真的需要使用相同的功能來處理它們嗎?例如,您可以分別使list_Cons_pointerlist_Cons_int接受一個實際指針和一個匹配preindexed的整數類型。

是否應該更改preindexed的類型取決於它在程序中的含義。

除此之外,intptr_t保證足夠大,以容納一個指針,但它可能會更大。這意味着在所有可能的環境中真的沒有辦法擺脫所有警告(想想48位指針......)

+0

是的,我必須混合使用指針和整數。它的數據結構類似於LISP。鏈表和二叉樹是數據結構,我也必須使用相同的功能。在這種情況下,whicha可能是最優化的方式? – thetna 2011-04-22 18:09:16

相關問題