Ich habe Probleme, zu verstehen, warum ein Code funktioniert. Das Folgende ist eine Vergleichsfunktion für die Implementierung von qsort in stdlib:
%Vor%Das funktioniert natürlich nur für Strings. Meine Frage ist: Warum funktioniert der Code unten?
%Vor% Es scheint mir, dass ich in der zweiten Version gewaltsam Casting mache, was eindeutig ein char*
zu char**
ist. Das Problem ist, dass die Variable immer noch eine Adresse an eine Variable char
enthält. Wenn ich *
anwende, verstehe ich, dass C diesen Befehl verarbeitet, indem er den Inhalt von p1
abruft und dann 8 Bytes (auf meinem Bogen) liest, die der gespeicherten Adresse folgt, so dass er letztendlich einen Wert erhält vom Typ char*
.
Dies sollte meines Erachtens dazu führen, dass 8 Zeichen an eine ungültige Speicheradresse gebunden werden.
Trotzdem funktionieren beide Funktionen gleich gut. Wo gehe ich falsch?
Nehmen wir an, Sie möchten ein Array von int
s mit qsort
sortieren.
Zuerst erstellen Sie eine Funktion, die zwei int
s vergleichen kann.
Dann können Sie verwenden:
%Vor% Wenn numbers
an qsort
übergeben wird, wird es in int*
zerlegt und als void*
übergeben. Wenn wir die Zahl aus void*
in intCompare
extrahieren müssen, müssen wir sie in int*
umwandeln, bevor wir den Zeiger dereferenzieren und die Werte vergleichen.
Nehmen wir die Analogie zu Strings, sagen wir mal, dass Sie sortieren wollen:
%Vor% Der Aufruf von qsort
lautet:
Wenn strings
an qsort
übergeben wird, wird es in char**
zerlegt und als void*
übergeben. Die zugrunde liegenden Typen der Zeiger, die an scmp
von qsort
übergeben werden, haben den Typ char**
, nicht char*
. Daher ist es richtig zu verwenden:
Die erste Version funktioniert in einigen Fällen aufgrund eines glücklichen Zufalls. Hier ist ein Beispielprogramm, das einige Fälle zeigt, in denen es nicht funktioniert, während die zweite Version immer funktionieren sollte.
%Vor%Ausgabe (mit gcc 4.8.4):
%Vor%