我遇到了XOR双链接列表的问题,该列表有一个必须包含NEXT和PREV节点指针的指针。我必须xor地址指针这样做,但我不能。 我可以分配一个与两个地址进行异或的内存地址,但是我无法获取其地址的值(这有分段错误错误):
int main(){
int* ptr = new int;
int *ptr2 = new int;
ptr2 = (int*)((unsigned long)ptr ^ (unsigned long)ptr2);
*ptr2= 5; /here has segmentation fault
cout <<*ptr2;
return 0;
为什么此代码有错误?我该如何解决?
感谢您的回复,但我无法转移我的想法,换言之我说的问题: 通常我们有一个指针,通过“ new ”(用c ++)关键字为它分配内存空间。我们的指针保留的这个地址是由os确定的,对吗? 例如,指针指向它的地址是0x8f3400b(这是可以保留的内存空闲的地方) 我希望手动执行此操作,而不是使用 new 关键字,例如此代码:
int* ptr1 = (int*) 0x2355;
int* ptr2 = (int*) 0x23ff;
现在我不知道地址0x2355和0x23ff是否可以保留? 然后我决定“ new ”这些指针,然后对它们进行异或,如下所示:
int* ptr1 = new int //ptr1 is now manage by OS
int* ptr2 = new int //like ptr1 ...
然后我想要对这些指针进行XOR操作并创建一个新空间来附加一个节点,这是第三个节点,但我不能解决它是正确的但是当我想评估它时发生了分段错误:
int* ptr1 = new int; // for example the address is X
int* ptr2 = new int; // for example the address is Y
int* ptr3 = (int*)((unsigned long)ptr1 ^ (unsigned long)ptr2); //the final address is X^Y
我怎么能纠正这个? 我不知道如何使用intptr_t和其他请帮助我 感谢
答案 0 :(得分:9)
有一个非常难看的技巧(如果它有效)让你实现一个双链表,每个节点只有一个指针。如你所说,它需要xor'ing指针值。
这几乎总是一个非常糟糕的主意。该语言并不能保证它完全可以使用。
如果必须这样做,请将指针值转换为uintptr_t
或intptr_t
(这些类型甚至不保证存在,但它们可能存在),在<stdint.h>
或<cstdint>
。
xor'ing两个指针值的结果将不是一个有效的指针,任何尝试使用它的人都会在你脸上爆炸(如果你很幸运的话)。从这样的操作中获取有效指针的唯一方法是反转它,获取原始指针值。您的*ptr2 = 5;
导致细分错误并不奇怪。
如果你这样做是为了锻炼,只要看看你是否可以让它发挥作用,一定要继续前进并享受乐趣。
如果您认为对此有一些实际要求,您不。如果你想要一个双向链表,每个节点只有两个指针。或者,更好的是,因为您使用C ++编程,所以请使用标准库容器类之一。
答案 1 :(得分:1)
如果您绝对想要将指针转换为某种整数类型,请至少使用intptr_t
(由<cstdint>
或<stdint.h>
头文件提供)。
为什么要 xor 指针?这是一个丑陋的伎俩!它排序编译器优化。
答案 2 :(得分:0)
使用turbo C 3.0版,我们已经实现了双链表,其中一个指针利用了XOR。传递你的评论......'C'是FINDMIND的变革团队。
/* Code developed by 'C' The Change Team of FINDMIND
Prabhakaran D, Vaishnavi N K, N N Priya, guided by
Mr.Sridhar Arumugaswamy */
#include <stdio.h>
#include <conio.h>
struct Node {
int data;
unsigned int next;
}*start, *end, *newNode;
typedef struct Node NODE;
int menu(){
int choice;
clrscr();
printf("1.Add\n2.Display\n3.Exit\n");
scanf("%d", &choice );
fflush(stdin);
return choice;
}
void add() {
clrscr();
newNode = ( NODE * ) malloc ( sizeof( NODE ) );
newNode -> next = 0;
printf("Enter the data to enter :");
scanf("%d", &(newNode -> data) );
fflush(stdin);
if( start == NULL ) {
start = end = newNode;
} else {
newNode -> next = (unsigned int)end ^ 0;
end -> next = ( end -> next ^ 0 ) ^ ( unsigned int)newNode;
end = newNode;
}
}
void display() {
NODE *temp, *curr, *prev;
prev = curr = temp = NULL;
clrscr();
for ( curr = start; curr != end ; temp = prev ,\
prev = curr , curr = ( NODE * ) ( curr -> next ^ (unsigned int)temp ) )
printf("%d\n", curr -> data );
printf("%d\n", curr -> data );
getch();
}
void main() {
int choice;
choice = menu();
do {
switch( choice ) {
case 1: add();
break;
case 2: display();
break;
case 3: printf("\n\nBye!!!");
break;
default: printf("Bug dude!!!");
}
choice = menu();
} while(choice != 3);
}