Zeiger / Adressdifferenz [duplizieren]

7

Warum ist der Unterschied zwischen den beiden Adressen falsch? Ссылка

%Vor%

Ausgabe:

%Vor%     
Ava 24.03.2012, 20:47
quelle

3 Antworten

17

Zuerst wird die Zeigerarithmetik nicht definiert, wenn sie auf nicht verwandten Zeigern ausgeführt wird.

Zweitens macht es Sinn. Beim Subtrahieren von Zeigern erhalten Sie die Anzahl der Elemente zwischen diesen Adressen, nicht die Anzahl der Bytes.

Wenn Sie das mit

versuchen sollten %Vor%

Sie würden ein anderes Ergebnis erhalten.

Als Randnotiz verwenden Sie %p beim Drucken von Zeigern.

    
cnicutar 24.03.2012, 20:49
quelle
6

Wie andere bereits gesagt haben, ist das Ergebnis ein Vielfaches der Größe des Typs, auf den die Zeiger zeigen. Wirf sie als Char-Zeiger aus, und das Ergebnis wird in Bytes ausgedrückt. Außerdem sollten Sie den ptrdiff_t-Typ verwenden, damit auf Systemen mit 64-Bit-Zeigern der Typ sollte groß genug sein, um das Ergebnis zu halten.

%Vor%

Beachten Sie auch, dass die Differenz der Adressen zweier Werte, die nicht im selben Array liegen, im Standard nicht definiert ist, aber für jedes System funktioniert.

    
AgentME 24.03.2012 20:55
quelle
2

Genau genommen verursacht Ihr Programm einige Arten von undefiniertem Verhalten, zuerst aufgrund der Zeigerarithmetik bei nicht verwandten Zeigern und dann, weil Formatzeichenfolgen und Argumente in Ihren print-Anweisungen nicht übereinstimmen. Aber selbst wenn diese korrigiert würden, würden Sie die gleichen Ergebnisse sehen. Der Grund für die Differenz ist 1, weil die Zeigerarithmetik Ergebnisse in Einheiten der Größe des auf Typ verwiesenen Wertes liefert - in Ihrem Fall int ist ein 4-Byte-Typ, also Subtraktion int * Zeiger, die 4 Bytes auseinander zeigen, ergeben ein Ergebnis von 1.

    
Carl Norum 24.03.2012 20:52
quelle

Tags und Links