Stellen Sie sich dieses ziemlich einfache Szenario vor. Ich habe eine Funktion, die einige Manipulationen durchführt und ein Array von Zeichenzeigern zurückgibt. Aus Gründen der Einfachheit, lassen Sie diese Funktion keine Argumente haben:Zurückgeben eines Arrays von Zeichenfolgen (char *) in C
#include <stdio.h>
char **func(void);
int main() {
printf("%s\n", func()[0]);
return 0;
}
char **func() {
static char arr[3][10] = {"hi", "bye", "cry"};
return arr;
}
Ich möchte dieses Array zugreifen können, in meiner main()
Funktion. Ich mache das Array statisch, um zu vermeiden, dass die Adresse an eine lokale Variable zurückgegeben wird, die im Bereich func()
definiert ist. Dieser Code kompiliert, aber mit einer Warnung:
Warnung: Rückkehr von inkompatiblen Zeigertyp [-Wincompatible-pointer-types]
Rückkehr arr;
^
Aber was soll ich die Rückkehr Argument machen dann? Ein Zeiger auf ein Char-Array? Ich dachte, dass es in C schlecht ist, ein Array zurückzugeben.
Das Ausführen dieses Programms führt zu einem nicht hilfreichen Segmentierungsfehler.
Also was mache ich falsch? Kann ich keinen Zeiger auf ein Array von Zeichenzeigern zurückgeben? Daher ist ein char **
? Füge ich Array/Pointer-Zerfall zusammen? Wie würde ich ein Array von Strings zurückgeben? Gibt es eine Möglichkeit, ein Zeichenfolgenarray ohne das Schlüsselwort static
zurückzugeben?
Edit: Sicher können Sie alle mit meiner Verwirrung einfühlen? Es ist nicht so, als ob die Array-Pointer-Zerfallsfunktion von C trivial ist.
Sie haben kein Array von 'char *'. 'char **' und 'char [] []' ist nicht derselbe Datentyp.Warum deklarieren Sie Ihr Array nicht als 'static char * arr [] = {"hi", "tschüss", "weinen"}; 'Dann können Sie' arr' wie im ursprünglichen Code zurückgeben. – DyZ
Was machst du falsch? Sie möchten ein Array von Char-Zeigern zurückgeben, aber Sie haben kein Array von Char-Zeigern *. (Es ist so, als wolle man in eine Welt zurückkehren, in der die globale Erwärmung nicht stattfindet.) –