Pointer auf ein Array an main() zurückgeben -> unerwartete Werte des Arrays in main()



  • Hallo Commuity,

    ich habe ein Array in einer Funktion erstellt, dann wollte ich dieses mittels eines Pointer an die main() - Funktion zurückgeben, aber es ist nur der erste Wert des Arrays korrekt. Die anderen wurden anscheinen überschrieben, weil innerhalb der Funktion funktionert es auch mit einem Zugriff über Pointer(wie in der main()). Ich habe den Pointer auch als static deklariert, damit er das Funktionsende "überlebt".

    #include <stdio.h>
    
    int* computeArray(int size);
    
    int main(void){
        int size;
        printf("Size of Array:");
        scanf("%d",&size);
        int *ptrOnArray = computeArray(size);
        for(int i = 0; i<size; i++){
            printf("%d\n",*ptrOnArray);
            ptrOnArray += 1;
        }
    }
    
    int* computeArray(int size){
        int  array[size];
        for(int i = 0; i < size; i++){
            array[i] = (i+1) *2;
        }
    
        static int *ptr;
        ptr = &array[0];
        return ptr;
    }
    


  • Der Pointer muss nicht überleben, sondern das Array. Du hättest daher das Array als static deklarieren müssen. Aber das geht natürlich nicht, wenn seine Größe von dem Parameter abhängt. Es gibt dafür keine elegante Lösung, du wirst dich wohl mit malloc/free auseinandersetzen müssen.


  • Global Moderator

    Das Thema ist hier allgemeines Ressourcenhandling in C. Das kann Speicherplatz für ein Array sein, aber das gilt auch allgemein.

    Was man in solchen Fällen normalerweise macht, ist, dass der Aufrufer der Funktion ein passend großes Array (oder allgemein die passenden Ressourcen) übergibt. Damit erschlägt man erst einmal 50% aller Fälle auf zufriedenstellende Weise.

    Schwieriger wird es, wenn der Aufrufer vorher nicht wissen kann, wie groß das Array sein muss oder welche Art von Ressourcen er zur Verfügung stellen muss. Dann definiert man sich einen Handler, dessen Aufbewahrung und richtige Handhabung dem Anwender überlassen wird. Der Anwender muss den Handler immer zwischen den Funktionen hin und her reichen, die die Ressource benutzen. Und das ist dann auch recht elegant. Eine Umsetzung davon, die jeder kennt, ist das Dateihandling in C: Der Anwender kann unmöglich eine Dateiressource selber erstellen, stattdessen hat er einen FILE-Pointer als Handler, den er von fopen mit Inhalt befüllen lässt, immer zwischen den ganzen firgendwas-Funktionen herreicht, und schließlich mit fclose entsorgt.