C 从指针强制转换为不同大小的整数警告
我越来越 警告:从指针强制转换为不同大小的整数 在第C 从指针强制转换为不同大小的整数警告,c,C,我越来越 警告:从指针强制转换为不同大小的整数 在第行返回(Node*)((unsigned int)(a)^(unsigned int)(b))。我怎样才能摆脱它? XORing地址的目的是实现一个XORed链接列表,它是一个双链接列表,只包含一个字段,可以在列表中来回遍历。npx字段包含指向下一个节点的指针和指向上一个节点的指针之间的差异。指针差通过XORing计算 typedef struct _node { int data; struct _node *npx;
行返回(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;
}
您可以使用#include
和整数类型uintpttr\u t
,该类型定义为能够从7.18.1.4中指向void
的任何有效指针转换,以避免警告
Node * XOR(Node *a, Node *b){
return (Node *) ((uintptr_t)(a) ^ (uintptr_t)(b));
}
为什么要对指针进行XORing?可以通过不将指针强制转换为整数来消除警告。实际上,通过对(相对)指针进行XORing,可以做一些有趣的事情,比如将双链接列表的正向和反向指针压缩到同一字段中。但这是一个汇编程序,而不是C域,现在可能已经过时了。@dbush对指针地址进行XORing的原因,正如托夫罗提到的,我正试图通过压缩同一字段中的向前和向后指针来实现一个内存高效的双链表。Ref:int不一定与指针大小相同uintpttr\u t
也在
中定义,这不会引入所有printf和scanf格式字符串定义。注意:如果转换到节点*
的结果不是有效指针(或null),则会导致未定义的行为