Probleme mit Zeigern und Zeigern auf Zeiger

8

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?

    
user1123530 30.05.2016, 20:57
quelle

1 Antwort

6

Nehmen wir an, Sie möchten ein Array von int s mit qsort sortieren.

%Vor%

Zuerst erstellen Sie eine Funktion, die zwei int s vergleichen kann.

%Vor%

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:

%Vor%

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:

%Vor%

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%     
R Sahu 30.05.2016, 21:30
quelle

Tags und Links