Immer der Unterschied zwischen beiden Speicher-Adressen
Habe ich die Speicher-Adresse von einem int *
:0xbfde61e0. Ich habe auch noch eine Speicher-Adresse (das ist auch int *
. Wie kann ich berechnen, den Unterschied zwischen den beiden zu verwenden wie ein offset zwischen den beiden Standorten?
sollten Sie suchen für die "nach-Arithmetik"
Obwohl die Antworten, die Sie bekommen, werden wahrscheinlich in der Praxis arbeiten, sollten Sie sich bewusst sein, dass, wenn die zwei Eingabe-Zeiger deuten nicht auf Elemente des gleichen Arrays, das Ergebnis der Subtraktion Ihnen ist nicht definiert. Wenn Sie beide Zeiger in einen int-array, das Ergebnis der Subtraktion wird in Einheiten von sizeof(int), nicht bytes.
grundsätzlich gilt: tun Sie das nicht. Wenn Sie möchten, erkennen die Größe eines Arrays mit, bitte: tun Sie sich einen gefallen und pass die Größe getrennt.
Wenn beide Speicher-Adressen, subtrahieren Sie wird gut funktionieren. Die Ergebnis ist nicht garantiert nützlich sein, in jeglicher Weise oder form, aber die Bedienung sollte gut funktionieren
Der standard fordert, diese als "undefined behavior", was bedeutet, dass eine konforme Implementierung darf Ertrag das Ergebnis, die Sie erwarten sind, oder dump core, oder senden Sie böse E-Mail an Ihren Chef. Wie ich schon sagte, ist es wahrscheinlich, um die Arbeit in der Praxis, aber es ist gut, sich bewusst zu sein, potenzielle Probleme.
Obwohl die Antworten, die Sie bekommen, werden wahrscheinlich in der Praxis arbeiten, sollten Sie sich bewusst sein, dass, wenn die zwei Eingabe-Zeiger deuten nicht auf Elemente des gleichen Arrays, das Ergebnis der Subtraktion Ihnen ist nicht definiert. Wenn Sie beide Zeiger in einen int-array, das Ergebnis der Subtraktion wird in Einheiten von sizeof(int), nicht bytes.
grundsätzlich gilt: tun Sie das nicht. Wenn Sie möchten, erkennen die Größe eines Arrays mit, bitte: tun Sie sich einen gefallen und pass die Größe getrennt.
Wenn beide Speicher-Adressen, subtrahieren Sie wird gut funktionieren. Die Ergebnis ist nicht garantiert nützlich sein, in jeglicher Weise oder form, aber die Bedienung sollte gut funktionieren
Der standard fordert, diese als "undefined behavior", was bedeutet, dass eine konforme Implementierung darf Ertrag das Ergebnis, die Sie erwarten sind, oder dump core, oder senden Sie böse E-Mail an Ihren Chef. Wie ich schon sagte, ist es wahrscheinlich, um die Arbeit in der Praxis, aber es ist gut, sich bewusst zu sein, potenzielle Probleme.
InformationsquelleAutor Matt Altepeter | 2012-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seine so einfach wie es klingt.
Beachten Sie, dass die Differenz ein Vielfaches von
sizeof(int)
. Wenn Sie möchten, dass der Unterschied in bytes, dies zu tun:Ohne bestimmten code oder eine bestimmte Anwendung, die ich nicht bekommen kann detaillierter als das.
ptrdiff_t
. Gießen Sie es aufint
bekommen kann man in Schwierigkeiten.Wir reden von Sicherheit hacking. Der Teil, den ich gerade arbeite ist der Druck, den stack und die Werte an den Standorten in den Stapel von einem bestimmten Punkt im Speicher zu einem anderen Punkt. Da die Adressen dieser Standorte im Speicher ändern können, jedes mal, wenn ein Programm ausgeführt wird, wurden wir beauftragt, die Verwendung einer offset-denn das wird immer die gleichen bleiben egal was für Rechner es laufen soll. Ich erwähnte eine Adresse in der ursprünglichen post und ein weiteres Kommentar auf der vorherigen Antwort.
Tatsächlich, sind das nicht die richtigen Adressen. Die Adressen sind: 0xbfa00be4 und 0xbfa00b50.
Bekomme ich eine Einpresstiefe von 37. Dies scheint korrekt zu sein.
InformationsquelleAutor riwalk
Ich würde wirklich gerne mehr details darüber, wie du mit diesen Informationen. Das könnte für sehr viel präziser beantworten.
Sowieso. normalerweise, was passiert:
Es gibt, wie man die zwei verschiedenen offsets zwischen zwei Zeiger. Jetzt natürlich, wenn Ihre Zeiger sind nicht nebeneinander auf dem stack, die Werte beginnen sich zu ändern:
Je mehr Abstand und verschiedene Arten zwischen den beiden desto mehr verlieren wir offensichtliche "offset" zwischen zwei Variablen, in anderen Worten, das beginnt zu sinnlos. Dies ist der Grund, warum Zeiger-Arithmetik ist wirklich nur arbeitet auf arrays (da Sie bekannt sind zusammenhängenden Speicher einer bestimmten Art). So wie in Ihrem Fall:
Diese sind ein gutes Stück entfernt. So können Sie abziehen, aber ich bin nicht sicher, warum Sie würde dies tun.
int
ist 4 bytes. Verwendenuintprt_t
oderintptr_t
füry
undz
stattint
.InformationsquelleAutor Mike
Ich denke, dies wird den offset.
Zwei Adressen, die in Frage sind die oben genannten und diesem: 0xbfbf69e0. Bei der Durchführung der Kalkulation und dem drucken bekomme ich -63936. Dies scheint nicht der richtige Wert. Ich subtrahiere die man erwähnt in diesem Kommentar von der, die oben aufgeführt sind.
Ich habe herausgefunden, mein Problem. Dumme Fehler meinerseits. Ich lief die Programme getrennt, so dass die Adressen wurden nicht in der gleichen array.
InformationsquelleAutor Lews Therin