Warum kann man nicht Zeiger auf Char-Zeiger anstelle von Array von Char-Zeigern verwenden?

8

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?

%Vor%     
stressed_geek 06.06.2012, 11:26
quelle

4 Antworten

6

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%     
Manik Sidana 06.06.2012, 11:32
quelle
2

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.

    
glglgl 06.06.2012 11:32
quelle
2

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)

    
Agent_L 06.06.2012 11:42
quelle
0

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.

    
Kenneth 06.06.2012 12:01
quelle

Tags und Links