Initialisieren char**
Ich bin sehr neu in C++. Ich versuche, eine Funktion aufzurufen, nimmt in " char**":
bool func(char** a) {
//blablabla
}
So dauert es in ein array von c-strings. Ich brauche zum erstellen eines char**, aber nichts funktioniert.
char** a = char[255][255]; //error: type name is not allowed
char** a = new char[255][255]; //error: a value of type "char (*)[255]" cannot be used to initialize an entity of type "char **"
char a[][] = {"banana", "apple"};
char** b = &a; //error: a value of type "<error-type> (*)[2]" cannot be used to initialize an entity of type "char **"
Ich am Ende tun müssen:
char* a[] = {"banana", "apple"};
Warum die ersten nicht funktioniert hat und warum die letzten gearbeitet?
Vielen Dank im Voraus.
- Das erste paar hat nicht funktioniert aus genau den Gründen, die der compiler gab Sie in die Fehler. Nicht sicher, welche Art von anderen Antwort erwarten Sie hier. Code wie
char **a = char[255][255]
ist einfach kein gültiges C++, so dass es nicht kompilieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt eine Menge Fehler in Ihrem code.
Zunächst ist es nicht auch gültige C++ (oder C für diese Angelegenheit). Vielleicht haben Sie gedacht:
In jedem Fall immer daran denken, dass der Typ einer bi-dimensional dynamisch reservierten Arrays ist nicht
**
aber(*)[N]
das ist sehr Verschieden.Die Fehlermeldung, die Sie in den Kommentar, in dem genau erklärt, was ich früher gesagt habe.
Im obigen code der richtige Typ der Variablen
a
solltechar* a[]
. Wieder, arrays und Zeiger (für das, was den Typ betrifft) sind sehr verschiedene Dinge. Einchar
array kann decay Zeiger (wennNULL
abgebrochen), aber für den rest, außer mit expliziten casts, die Sie nicht verwenden können, Pointer und arrays, wie Sie tun.Die Letzte funktionierte, weil, wie ich schon sagte:
char* []
ist der richtige Typ für ein array von C-strings.Sowieso, wenn Sie gerade Hausaufgaben machen, es ist ok, um zu lernen, diese Dinge. Aber in Zukunft-Entwicklung mit C++: versuchen Sie nicht zu verwenden "Funktionen", starten Sie mit
C-
wie C-strings, C-arrays, etc. C++standard-Bibliothek gibt Ihnenstd::string
,std::array
,std::vector
und solche kostenlos.Wenn Sie wirklich zuteilen müssen, dynamischen Arbeitsspeicher (mit
new
unddelete
odernew[]
unddelete[]
) bitte verwenden Sie smart Pointer, wiestd::shared_ptr
oderstd::unique_ptr
.Sie sagen, Sie arbeiten in C++. Dann können Sie einfach ignorieren
const char*
undchar**
und konzentrieren, was Sie können:Wenn Sie wissen, die Größe zur compile-Zeit können Sie sogar
std::array
:EDIT: da müssen Sie bauen ein array von C-strings in jedem Fall können Sie leicht tun Sie es, ausgehend von dem Vektor:
new
nach Vorstellungstd::vector
. Warum nichtstd::vector<char const*>
?ist zweideutig - es kann bedeuten:
char* arr[]
stattIm ersten Fall ist es ganz einfach:
jedoch im zweiten Fall ist es etwas komplexer. Die Funktion wird nicht wissen, die Länge des Arrays, so dass Sie brauchen, um Sie zu beenden, die explizit mit einem
NULL
, wie zum Beispielenviron
ist:so
char** a = char[255][255];
es ist komisch zu C und C++und wenn Sie wollen, eine statische 2d-array nur
char[255][255]
ist nicht konvertierbarchar**
(da es sich um zusammenhängenden Speicher von 255 * 255 chars). Es solltechar *a[255];
(255 Zeigern auf c-strings irgendwo, die umgewandelt werden können, um Zeiger auf ersten c-string, d.h.char**
).