casting char [] [] char ** verursacht segfault?

8

Ok, mein C ist ein bisschen rostig, aber ich dachte mir, ich würde mein nächstes (kleines) Projekt in C machen, damit ich es wieder auffrischen kann und weniger als 20 Zeilen habe ich schon einen seg-Fehler.

Dies ist mein vollständiger Code:

%Vor%

Ich bin völlig verwirrt darüber, wie dies einen Segfault verursacht. Was passiert beim Casting von [][] nach ** !? Das ist die einzige Warnung, die ich bekomme.

%Vor%

Sind [][] und ** wirklich nicht kompatible Zeigertypen? Sie scheinen mir nur Syntax zu sein.

    
Earlz 24.05.2010, 07:29
quelle

3 Antworten

35

A char[ROWS][COLS+1] kann nicht in char** umgewandelt werden. Das Eingabeargument von print_map sollte

sein %Vor%

oder

%Vor%

Der Unterschied ist, dass char** bedeutet, auf etwas zu verweisen, das wie folgt dereferenziert werden kann:

%Vor%

Während ein char(*)[n] auf einen kontinuierlichen Speicherbereich wie diesen zeigt,

%Vor%

Wenn Sie (char(*)[5]) als (char**) behandeln, erhalten Sie einen Müll:

%Vor%     
kennytm 24.05.2010, 07:32
quelle
3

Wenn Sie diese Erklärung machen:

%Vor%

Sie erstellen ein array-of-arrays-of-char. Ein Array-of-char ist nur ein Block von Zeichen, und ein Array-of-arrays ist nur ein Block von Arrays - also ist main_map insgesamt nur ein ganzer Haufen von Zeichen. Es sieht so aus:

%Vor%

Wenn Sie main_map an print_map() übergeben, wird main_map als Zeiger auf das erste Element des Arrays ausgewertet - also zeigt dieser Zeiger auf den Anfang dieses Speicherblocks. Sie erzwingen, dass der Compiler dies in char ** konvertiert.

Wenn Sie map[0] innerhalb der Funktion auswerten (z. B. für die erste Iteration der Schleife), wird der char * -Wert abgerufen, auf den map zeigt. Wie Sie in der ASCII-Grafik sehen können, zeigt map leider nicht auf char * - es zeigt auf eine Menge einfacher char s. Es gibt überhaupt keine char * -Werte. An diesem Punkt laden Sie einige dieser char -Werte (4 oder 8 oder eine andere Zahl abhängig davon, wie groß char * auf Ihrer Plattform ist) und versuchen diese als char * -Wert zu interpretieren.

Wenn puts() dann versucht, diesem falschen char * -Wert zu folgen, erhalten Sie Ihren Segmentierungsfehler.

    
caf 24.05.2010 07:45
quelle
1

Wenn ich meinen Code betrachte, merke ich, dass die Anzahl der Spalten konstant ist, aber das ist eigentlich egal, weil es nur eine Zeichenkette ist. Also habe ich es so geändert, dass main_map ein Array von Strings (er, char pointers) ist. Das macht es so, dass ich einfach ** verwenden kann, um es auch weiterzugeben:

%Vor%     
Earlz 24.05.2010 07:40
quelle