Rückgabezeichen[]/string aus einer Funktion [duplicate]
Lesezeit: 5 Minuten
Benutzer1993177
Ich bin ziemlich neu in der Programmierung in C und versuche derzeit, eine Funktion zu erstellen, die ein String-/Char-Array zurückgibt und einer Variablen zuweist.
Bisher habe ich beobachtet, dass die Rückgabe eines char * die häufigste Lösung ist. Also habe ich versucht:
Meine Frage ist, wie ich diese Rückgabe verwende char* und weisen Sie das char-Array, auf das es zeigt, einem char zu[] Variable?
Ich habe es versucht (alle führten zu Noob-Drowning-Fehlern):
char* charP = createStr();
char myStr[3] = &createStr();
char* charP = *createStr();
bessere Diskussion in zweifacher Ausfertigung, obwohl es neuer ist
– Antti Haapala – Слава Україні
7. August 2019 um 5:44 Uhr
Rubens
Beachten Sie, dass Sie die Variable nicht dynamisch zuweisen, was so ziemlich die darin enthaltenen Daten bedeutet strin Ihrer Funktion, gehen am Ende der Funktion verloren.
Wenn Sie dann die Funktion aufrufen, muss der Typ der Variablen, die die Daten empfängt, mit dem der Funktionsrückgabe übereinstimmen. Sie sollten also haben:
char *returned_str = createStr();
Es ist erwähnenswert, dass der zurückgegebene Wert freigegeben werden muss, um Speicherlecks zu vermeiden.
sizeof(char) ist garantiert 1 und es gibt keinen Grund, das zu typisieren malloc Rückkehr
– Aniket Inge
22. Januar 2015 um 4:37 Uhr
@Aniket +1 Danke für den Kommentar. Mir wurde das manchmal von Freunden gesagt, aber ich glaube, ich habe das Problem bis dahin nicht verstanden und später nicht mehr daran gedacht 😀
– Rubens
22. Januar 2015 um 9:00 Uhr
Wenn Sie a zurückgeben möchten char* von einer Funktion, stellen Sie sicher, dass Sie malloc() es. Stack-initialisierte Zeichenarrays machen bei der Rückgabe keinen Sinn, da der Zugriff auf sie nach der Rückkehr von dieser Funktion ein undefiniertes Verhalten ist.
Es ist erwähnenswert, dass der zurückgegebene Wert freigegeben werden muss, um Speicherlecks zu vermeiden. char* astr = createStr(); doSomething(astr); free(astr);
– Wassilis
15. März 2016 um 17:47 Uhr
Das war, wonach ich gesucht habe! Ich war etwas verwirrt, als ich dachte, dass die Rückgabe eines Zeigers von der Funktion zu Speicherlecks führen kann. Ihre Antwort hat meine Frage gelöst. Dann wird der von char *astr gehaltene Speicher endlich freigegeben. (In Java zB verstehe ich das kein Problem, da würde sich der Garbage Collector darum kümmern)
– Hrushi
23. Februar 2017 um 19:46 Uhr
ARSD
Sie können ein statisches Array in Ihrer Methode verwenden, um den Verlust Ihres Arrays zu vermeiden, wenn Ihre Funktion endet:
Bearbeiten: Wie Toby Speight erwähnte, ist dieser Ansatz nicht Thread-sicher, und auch das Aufrufen der Funktion führt zu einem Überschreiben von Daten, das in einigen Anwendungen unerwünscht ist. Sie müssen also die Daten in einem Puffer speichern, sobald Sie von der Funktion zurückkehren. (Da es sich jedoch nicht um eine Thread-sichere Methode handelt, können gleichzeitige Aufrufe in einigen Fällen immer noch Probleme verursachen, und um dies zu verhindern, müssen Sie die Sperre verwenden. Erfassen Sie sie beim Aufrufen der Funktion und geben Sie sie nach dem Kopieren frei. Ich ziehe es vor, dies nicht zu verwenden Ansatz, weil es chaotisch und fehleranfällig ist.)
Es lohnt sich wahrscheinlich, einige der Nachteile zu erwähnen (alle Aufrufe teilen sich denselben Speicher, sodass Aufrufe frühere Ergebnisse überschreiben und nichts Thread-sicher ist).
– Toby Speight
26. Februar 2020 um 18:09 Uhr
char* charP = createStr();
Wäre richtig, wenn Ihre Funktion richtig wäre. Leider geben Sie einen Zeiger auf eine lokale Variable in der Funktion zurück, was bedeutet, dass es sich um einen Zeiger auf undefinierte Daten handelt, sobald die Funktion zurückkehrt. Sie müssen eine Heap-Zuweisung wie malloc für die Zeichenfolge in Ihrer Funktion verwenden, damit der zurückgegebene Zeiger eine Bedeutung hat. Dann müssen Sie daran denken, es später freizugeben.
Das Einfügen von “string.h” macht die Sache einfacher. Eine einfachere Möglichkeit, Ihr Problem anzugehen, ist:
#include <string.h>
char* createStr(){
static char str[20] = "my";
return str;
}
int main(){
char a[20];
strcpy(a,createStr()); //this will copy the returned value of createStr() into a[]
printf("%s",a);
return 0;
}
Ja, Sie können das auch verwenden und das wird etwas Speicher sparen, es ist nur so, dass er nach einer Möglichkeit gefragt hat, “das char-Array, auf das es (Funktion) zeigt, einem char zuzuweisen[] variabel”, also sagte ich ihm genau das.
Ja, Sie können das auch verwenden und das wird etwas Speicher sparen, es ist nur so, dass er nach einer Möglichkeit gefragt hat, “das char-Array, auf das es (Funktion) zeigt, einem char zuzuweisen[] variabel”, also sagte ich ihm genau das.
– Adnan
12. März 2017 um 13:15 Uhr
14089600cookie-checkRückgabezeichen[]/string aus einer Funktion [duplicate]yes
bessere Diskussion in zweifacher Ausfertigung, obwohl es neuer ist
– Antti Haapala – Слава Україні
7. August 2019 um 5:44 Uhr