2012-07-29 85 views
0
Queue queue = createQueue(); //queue to store int values 
Node *node = getNode(8); 
enQueue(queue, (int)node);//storing an address in the int 

..... some other statements .... 

Node *root = (Node *) deQueue(queue);//typecasting an int to address 
Node *left = root->left; 

在上面的代碼中,隊列可以存儲整數值,同時地址被存儲分配給它。 它可以產生任何問題?可以將類型轉換爲整數嗎?

在int中存儲地址可能會有問題的情況或任何架構是什麼?

請舉一些例子。

回答

9

什麼是情況或任何架構在int中存儲地址可能會有問題?

指針大於int的架構。也就是說,大多數64位系統。您可以使用類型long或更好intptr_t

+0

還有'uintptr_t',都在'stdint.h' – 2012-07-29 11:29:53

+0

+1,我從來不知道'intptr_t' /'uintptr_t'。 – orlp 2012-07-29 11:34:19

+1

沒錯。問題中描述的方法不是一個好主意。最好使用輔助數組的Node對象,並將Node對象的索引存儲在隊列中(假設無法更改用於管理隊列類型實例的接口)。 – 2012-07-29 11:34:44

1

你不必去怪誕的架構,其中你的假設會咬你的屁股,利用64位英特爾拱門:

#include <stdio.h> 
#include <stdlib.h> 

int 
main(int argc, const char *argv[]) 
{ 
    printf("sizeof int is %i\n", sizeof(int)); 
    printf("sizeof long is %i\n", sizeof(long)); 
    printf("sizeof void * is %i\n", sizeof(void *)); 

    exit(0); 
} 

其輸出

sizeof int is 4 
sizeof long is 8 
sizeof void * is 8 

所以,是的,你會遇到問題,因爲你會悄悄地截斷你的地址的高4字節,導致在基本上隨機存儲器上塗寫。

道德故事:如果你正在處理指針,使用指針。

1

對於32位系統,尺寸爲int,longint*通常是重合的,所以這不是問題。但在64位體系結構中投射指向整數(和返回)的指針可能會失敗。

使用C99或C11,它存在一個選項功能:(u)intptr_tstdint.h(一個整數類型,它可以存儲存儲在void指針中的值)。它適用於多種平臺,除了使用補碼的機器外。

使用C89,可以使用unsigned long變量;它通常會工作。但爲什麼不使用void指針?

相關問題