Wenn ich die zweite Option im folgenden Code versuche, names
zu initialisieren, erhalte ich einen Segmentierungsfehler. Ich denke, es gibt etwas konzeptionell falsch mit der zweiten Option. Irgendwelche Ideen?
Ja. Im ersten Fall haben Sie ein Array von Zeigern. Jeder Zeiger zeigt auf einen separaten Gegenstand (Alan, Frank ...)
Die zweite Deklaration
%Vor%bedeutet, dass der Name ein Zeiger auf einen Zeiger ist [Sie können eine Reihe von Strings nicht initialisieren]. Wie in
%Vor%Es hat ein völlig anderes Speicherlayout.
Ihr erstes Beispiel ist ein Array von Zeigern. Es belegt 5 mal die Größe eines char *
.
Ihr zweites Beispiel ist jedoch ein Zeiger auf einen Ort, an dem ein oder mehrere char *
erwartet werden. Es ist nicht möglich, es so zu initialisieren, wie Sie es tun.
Im ersten Fall haben Sie ein Array von char*
. Das heißt, Sie haben Speicher für 5 char * - Variablen (die Einträge des Arrays) reserviert, die direkt hintereinander im Speicher abgelegt sind. Außerdem wird jeder von ihnen am Anfang jeder Zeichenfolge initialisiert.
Im zweiten Fall haben Sie einen Zeiger vom Typ char **. Sie haben nur genug Speicher für einen Zeiger.
(Ich habe übersprungen den Speicher für jede Zeichenfolge zu diskutieren. Es kann in beiden Fällen gleich sein, aber es ist hier irrelevant)
Es verursacht keinen Seg-Fehler mit gcc. Wenn Sie dies jedoch mit einem Ganzzahl-Array versuchen, könnte dies möglicherweise verdeutlichen, warum es nicht sehr sinnvoll ist:
%Vor%Das Seltsame ist, dass dieses Beispiel tatsächlich die erwarteten Ergebnisse für das Integer-Array liefert. Gcc erzeugt jedoch eine Warnung.