webentwicklung-frage-antwort-db.com.de

Rückgabe von char []/string aus einer Funktion

Ich bin ziemlich neu in der Codierung in C und derzeit versuche ich, eine Funktion zu erstellen, die ein C-String/Char-Array zurückgibt und einer Variablen zuweist.

Bisher stellte ich fest, dass die Rückgabe eines Zeichens * die häufigste Lösung ist. Also habe ich versucht:

char* createStr() {
    char char1= 'm';
    char char2= 'y';
    char str[3];
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';
    char* cp = str;
    return cp;
}

Meine Frage ist, wie ich diesen zurückgegebenen char* verwende und das char-Array, auf das er zeigt, einer char [] -Variable zuordne.

Ich habe es versucht (alles führte zu Noob-Ertrinkungsfehlern):

  1. char* charP = createStr();
  2. char myStr[3] = &createStr();
  3. char* charP = *createStr();
23
user1993177

Beachten Sie, dass Sie die Variable nicht dynamisch zuweisen. Dies bedeutet praktisch, dass die Daten in str in Ihrer Funktion am Ende der Funktion verloren gehen.

Du solltest haben:

char * createStr() {

    char char1= 'm';
    char char2= 'y';

    char *str = (char *) malloc(sizeof(char) * 3);
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';

    return str;

}

Wenn Sie dann die Funktion aufrufen, muss der Typ der Variablen, die die Daten erhalten soll, dem der Funktionsrückgabe entsprechen. Also sollten Sie haben:

char *returned_str = createStr();
31
Rubens

Wenn Sie einen char* von einer Funktion zurückgeben möchten, vergewissern Sie sich, dass Sie malloc() damit arbeiten. Stack-initialisierte Zeichen-Arrays sind für das Zurückgeben nicht sinnvoll, da der Zugriff auf sie nach dem Zurückkehren von dieser Funktion ein undefiniertes Verhalten ist.

Ändern Sie es in

char* createStr() {
    char char1= 'm';
    char char2= 'y';
    char *str = malloc(3 * sizeof(char));
    if(str == NULL) return NULL;
    str[0] = char1;
    str[1] = char2;
    str[2] = '\0';
    return str;
}
5
Aniket Inge
char* charP = createStr();

Wäre richtig, wenn deine Funktion korrekt 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 die 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.

5
Paulpro

Das Hinzufügen von "string.h" macht die Sache einfacher. Eine einfachere Lösung für Ihr Problem 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;
}
1
Adnan

sie können ein statisches Array in Ihrer Methode verwenden, um einen Verlust des Arrays zu vermeiden, wenn Ihre Funktion endet:

char * createStr() {

char char1= 'm';
char char2= 'y';

static char str[3];  
str[0] = char1;
str[1] = char2;
str[2] = '\0';

return str;

}

0
A.salehy