Ich habe Probleme mit XOR doppelt verknüpfen Liste, die einen Zeiger hat, die NEXT und PREV Zeiger von Knoten enthalten muss. Ich muss xor Adresse von Zeigern, dies zu tun, aber ich kann nicht. Ich kann eine Speicheradresse zuweisen, die aus zwei Adressen XORed, aber ich kann nicht Wert auf seine Adresse (dies hat Segmentation Fault Fehler):
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;
Warum hat dieser Code einen Fehler? Wie kann ich ihn beheben?
danke für Ihre Antwort, aber ich kann meine Idee nicht übertragen, ich sage meine Frage mit anderen Worten: Normalerweise haben wir einen Zeiger, dem wir den Speicherplatz zuweisen, indem wir " neu "Diese Adresse, die für unseren Zeiger reserviert ist, wird durch das Betriebssystem bestimmt, richtig? Zum Beispiel ist die Adresse, auf die der Zeiger zeigt, 0x8f3400b (dies ist der Ort, an dem der Speicher frei ist, der reserviert werden kann) Ich möchte das manuell tun, indem ich die Adresse nicht mit neu Schlüsselwort wie dieser Code:
int* ptr1 = (int*) 0x2355;
int* ptr2 = (int*) 0x23ff;
Jetzt weiß ich nicht, die Adresse 0x2355 und 0x23ff kann reserviert werden oder nicht? dann entscheide ich, dass " neu "Diese Zeiger werden mit XOR verknüpft (siehe unten):
int* ptr1 = new int //ptr1 is now manage by OS
int* ptr2 = new int //like ptr1 ...
dann möchte ich XORing diese Zeiger und machen einen neuen Raum, um einen Knoten anhängen, die der dritte Knoten ist, aber ich kippe die Adressierung der es korrekt ist, aber wenn ich es bewerten wollen Segmentierung Fehler aufgetreten:
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
Wie kann ich das korrigieren? Ich weiß nicht, wie man intptr_t und andere bitte helfen Sie mir danke