Array aus einer Funktion zurückgeben

Hallo zusammen,

ich programmiere gerade in C.

Ich versuche ein Array aus einer Funktion zurückzugeben und es dann mit „printf“ in der main-Funktion auszugeben.

int* test(int eins, int zwei){
   float wert[] = {0};
   wert[0] = eins;
   wert[0] = zwei;

return wert;
}

int main(void){
    int erste = 1,1;
    int zweite = 2,2;

    test(erste, zweite);
    printf("%f", test(erste, zweite));
}

Leider funktioniert das nicht, wie macht man das?
Ich habe das noch nie gemacht.

SG

In >C< geht das bspw. so, ABER der Aufrufer ist dann dafür verantwortlich, dass wieder aufgeräumt wird (insofern kein Array übergeben wurd):

#include <stdio.h>
#include <stdlib.h>

char *getchararray(int n)
{
    char *a = malloc(n);
    if (!a)
    {
        return NULL;
    }
    return a;
}

int32_t *getintarray(int n)
{
    int32_t *a = malloc(sizeof(int32_t) * n);
    if (!a)
    {
        return NULL;
    }
    return a;
}

int main()
{
    char *a = getchararray(15);
    int32_t *b = getintarray(15);
    char c = 1;
    size_t i = 0;
    if (!a)
    {
        free(a);
        c = 0;
    }
    if (!b)
    {
        free(b);
        c = 0;
    }
    if (c)
    {
        a[2] = 2;
        b[2] = 22222;
        for (i = 0; i < 15; i++)
        {
            printf("%d   %d\n", a[i], b[i]);
        }
    }
    return 0;
}

Und in >C++< ist das ganze sehr viel „komfortabler“…

Siehe auch https://stackoverflow.com/questions/11656532/returning-an-array-using-c

int erste = 1,1;
int zweite = 2,2;
  1. Punkt statt Komma
  2. Ist das ein Integer, also nur Ganzzahlen
wert[0] = zwei;

sollte selber klar sein

Zu guter Letzt hat CB einen sehr guten Link gepostet (da ich auch mal ganz stark annehme dass du C++ benötigst):

Das Array existiert nur innerhalb der Methode. Wenn die Methode mit dem return-Statement verlassen wird, wird der Inhalt des Speichers an dieser Stelle undefiniert.

das ist in sofern gar nicht so schlecht, weil Arrays in C++ kein „length“ Attribut und auch keine Checks ob du Daten in die Position -1 oder +800 schreibst, wie in Java haben.

Am besten übergibst du ein selbst erstelltes Array noch in der Methode.

Array in C sind sehr „roh“. Da kann man viel Mist damit machen.

Grundsätzlich ist es erstmal so, dass ein Array, der innerhalb einer Funktion deklariert ist, nicht „nach draußen“ gegeben werden darf. Der Grund: Sobald die Funktion verlassen wird, wird der Array „„ungültig““. (Eklig wird das dadurch, dass das ~„oft (erstmal) zu funktionieren scheint“ - bis dann die bösen crashes kommen).

In C muss man viel allgemeiner und viel, viel „disziplinierter“ als in Java auf die Frage achten: Wem ‚gehört‘ der Speicher?. Eine Faust- (oder Daumen?) - Regel ist: Wer den Speicher allokiert, muss ihn auch freigeben.

D.h. wenn eine C-Funktion irgendwas mit einem Array machen soll (wie in deinem Beispiel: Ihn füllen), dann wird normalerweise der Array in die Funktion übergeben. Mein C ist ziemlich eingeschlafen, aber GROB so würde das dann aussehen:

int fillArray(int* array, int length) {
    if (length < 2) return -1;
    array[0] = 123;
    array[1] = 234;
    return 0;
}

int main() {
    int n = 2;
    int *array = (int *) malloc(size * sizeof(int)); // Wer es allokiert....
    if (!array) return -1;
    int result = fillArray(array, n);
    ...
    free(array);                                     // ... gibt es auch frei!
    return 0;
}

Was ich da mit dem int-return-Wert angedeutet habe, wäre eine rudimentäre (!) Fehlerbehandlung. Darüber kann man für C ganze Bücher schreiben…


Fun fact:

int* array = ...;
int index = ...;

// Das hier....
array[index] = 123;

// ... ist das gleiche wie das hier...
*(array + index) = 123;

// ... und weil (a+b) das gleiche ist wie (b+a), ist das das gleiche wie das...
*(index + array) = 123;

// ... darum könnte man auch das schreiben:
index[array] = 123;

:dizzy_face: (Bist du sicher, dass du die Sprache lernen willst? :wink: )