Pointer nach Funktionsaufruf



  • Hallo,

    ich habe folgenden Code:

    int main(void) {
        int* ptr = NULL;
        function(ptr);
    
        printf("%d", ptr[0]);
    
        free(ptr);
    
        return EXIT_SUCCESS;
    }
    
    void function(int* ptr) {
        ptr = (int*)malloc(5 * sizeof(int));
    
        if (ptr == NULL) {
            printf("There is not enough memory.\n");
            exit (EXIT_FAILURE);
        }
    
        for (int i = 0; i < 5; i++) {
            *(ptr + i) = 1;
            printf("%d ", *(ptr + i));
        }
        printf("\n");
    }
    

    Warum bekomm ich hier

    printf("%d", bucketSizes[0]);
    

    einen Speicherzugriffsfehler? Der Pointer wird in der Funktion ja verändert, dann muss ich ihn ja nicht zurückgeben, also müsste das doch gehen?

    MfG



  • Du kannst kein richtiges Copy+Paste, bucketSizes ist nicht definiert, das compiliert nicht.
    In der Funktion function arbeitest du auf einer Kopie von ptr aus main, egal welche Änderungen du in der Funktion machst, nach dem Funktionsaufruf hat ptr denselben Wert wie vorher.
    Entweder du gibst den 'neuen' ptr aus function zurück oder du übergibst einen int** (statt int*).



  • Ist editiert.

    Hmm, und wenn ich nun 2 Pointer an die Funktion übergeben möchte und bei beiden das selbe mache, ich kann dann ja nur einen Pointer zurückgeben.

    Edit: Wenn ich ein Array zum Füllen an eine Funktion übergebe, ist das in der main danach ja auch sichtbar, warum hier aber nicht?



  • tobias321 schrieb:

    Ist editiert.

    Eher nicht. Im gezeigten Code kommt bucketsize gar nicht vor.

    tobias321 schrieb:

    Hmm, und wenn ich nun 2 Pointer an die Funktion übergeben möchte und bei beiden das selbe mache, ich kann dann ja nur einen Pointer zurückgeben.

    Edit: Wenn ich ein Array zum Füllen an eine Funktion übergebe, ist das in der main danach ja auch sichtbar, warum hier aber nicht?

    Ein Pointer ist auch nur eine Variable.

    Mit Hilfe eines Pointers kannst du verändern, worauf der Pointer zeigt.
    Du willst den Pointer verändern. DArum musst du auch die Adresse vom Pointer kennen.


Anmelden zum Antworten