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.
Sind [][]
und **
wirklich nicht kompatible Zeigertypen? Sie scheinen mir nur Syntax zu sein.
A char[ROWS][COLS+1]
kann nicht in char**
umgewandelt werden. Das Eingabeargument von print_map
sollte
oder
%Vor% Der Unterschied ist, dass char**
bedeutet, auf etwas zu verweisen, das wie folgt dereferenziert werden kann:
Während ein char(*)[n]
auf einen kontinuierlichen Speicherbereich wie diesen zeigt,
Wenn Sie (char(*)[5])
als (char**)
behandeln, erhalten Sie einen Müll:
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:
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.
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:
Tags und Links c pointers casting segmentation-fault