Zeiger auf Array zurueckgeben



  • Mahlzeit,

    ich habe einen Zeiger auf char Arrays der Laenge 40:
    char (*vec)[40] = malloc(laenge * sizeof(char[40]));
    Sprich eine beliebige Anzahl Strings, wobei jeder String 40 Zeichen lang ist.

    Nur wie mache ich das, wenn ich den Speicher in einer Funktion allokieren will und dann die Datenstruktur zuruckgeben will?

    ??? foo() {
    char (*strArr)[40] = malloc(laenge * sizeof(char[40])); 
    ...
    return strArr;
    }
    


  • Ich scheue solche Sachen immer, weil ich gerne mit Zeile und Spalte durcheinanderkomme und die Syntax von C da nicht wirklich übersichtlich ist.

    Ich weiß, daß mich dafür einige hauen wollen werden, aber ich mach' sowas immer über void *.

    EDIT: malloc gibt sowieso nur einen void * her, also reicht's, wenn Du außerhalb der Funktion castest.



  • Edit: (war ein Fehler drin ;))

    char **p;
    p = malloc(ANZAHL_AN_STRINGS * sizeof(char*))
    for (int i = 0; i < ANZAHL_AN_STRINGS; ++i)
      p[i] = malloc(40);
    

    Ungetestet, sollte aber funktionieren..
    War es das wonach du gesucht hast?



  • @cooky451: Nein, das ist nicht das wonach ich gesucht habe. Ausserdem ist dein Code falsch. Es muss z.B. malloc(N * sizeof(char*)) heissen und nicht malloc(N).

    Eigentlich war meine Frage doch ganz klar. Ich habe einen Zeiger auf Char Arrays (siehe 1. Posting strArr) und will den jetzt aus einer Funktion zurueckgeben. Wie muss die Funktionssignatur aussehen (die ??? eben im 1. Posting)?



  • Stimmt, zu schnell getippt 😉
    Allerdings verstehe ich den Sinn des obigen Codes immer noch nicht.
    Da du strArr 2 mal dereferenzierst und dem dann noch einen Zeiger gibst sollte das wohl ein char*** sein??



  • void *fkt(void)
    {
        static char ptr[][40]={"a","b","c"};
        return ptr;
    }
    
    int main()
    {
        char (*ptr)[40] = fkt();
        puts(*ptr);
        puts(*++ptr);
    }
    


  • So geht's:

    char (*fkt(void))[40] {
      char (*strArr)[40] = malloc(laenge * sizeof(char[40]));
      ...
      return strArr;
    }
    

    ...aber ich rate dir dringend dazu, für solche Späße typedef zu benutzen:

    typedef char (*str_array_t)[40];
    
    str_array_t fkt(void) { ... }
    

Anmelden zum Antworten