2016-08-20 83 views
-5

的整數我正在轉換爲大小不同的警告

警告:投從指針不同大小

的整數在行return (Node *) ((unsigned int)(a)^(unsigned int)(b));。我怎樣才能擺脫它? XORing地址的目的是實現一個XORed鏈接列表,它是一個雙向鏈接列表,它只包含一個在列表中來回移動的字段。 npx字段包含指向下一個節點的指針和指向前一個節點的指針之間的差異。指針差異通過XORing計算。

typedef struct _node { 
    int data; 
    struct _node *npx; 
}Node; 

Node * XOR(Node *a, Node *b){ 
    return (Node *) ((unsigned int)(a)^(unsigned int)(b)); 
} 

void addNode(int num, Node **head, int position, int flag) 
{ 
    Node * temp, *q; 
    Node *node = (Node *)malloc(sizeof(Node)); 
    node ->data = num; 
    node->npx = XOR(*head, NULL); 
    Node *next = XOR((*head)->npx, NULL); 
    (*head)->npx = XOR(node, next); 
    *head = node; 
    } 

int main() 
{ 
    Node *head = (Node *)malloc(sizeof(Node)); 
    head->data =23; 
    head->npx= NULL; 

    addNode(32, &head, 1, 0); 
    addNode(33, &head, 1, 0); 
    addNode(34, &head, 1, 0); 
    addNode(35, &head, 1, 0); 
    addNode(36, &head, 1, 0); 
    addNode(37, &head, 1, 0); 
    addNode(178, &head, 3, 1); 
    displayNode(&head); 
    return 0; 
} 
+8

你爲什麼異或指針? – dbush

+5

您可以通過不將指針轉換爲整數來擺脫警告。 –

+0

實際上,你可以通過XORing(相對)指針來做有趣的事情,比如將雙向鏈表的向前和向後指針壓縮到同一個字段。但是,這不過是一個彙編,而不是C域,現在可能已經過時了。 – tofro

回答

0

可以使用#include <inttypes.h>和整數型uintptr_t,其被定義爲能夠從任何有效的指針在N1570 7.18.1.4轉換爲void,以避免該警告。

Node * XOR(Node *a, Node *b){ 
    return (Node *) ((uintptr_t)(a)^(uintptr_t)(b)); 
} 
+3

的大小相同''uintptr_t'也在''中定義,它不會引入所有printf和scanf格式的字符串定義。 –

+2

注意:如果轉換爲'Node *'的結果不是有效指針(或null),則會導致未定義行爲 –