Pointer Speicher allokierung



  • Hi,

    Habe für eine Uniübung im themenbereich Speicherallokierung ein Problem.

    Also ich hab ein

    int **array;
    

    welches ich in einer extra Funktion allokieren muss.

    die Funktion ist bereits definiert mit

    void alloc(int*** array)
    

    so und nun meine Frage, wie muss ich hier mein 2D array richtig übergeben und vorallem dann wie spreche ich das array in der alloc fkt richtig an und allokier es dann richtig ?


  • Mod

    Muss das sein? Normalerweise gibt man niemals allokierten Speicher direkt zurück. Die Verantwortung für Allokation und Deallokation sollte niemals getrennt oder übertragen werden, wenn du bei Wartung oder Erweiterung eines Programms deine geistige Gesundheit behalten möchtest. Ganz besonders wenn der Programmierer nicht einmal die Grundlagen von Funktionsparametern kennt.

    int **array ist übrigens kein 2D-Array wie du es dir vermutlich vorstellst.



  • wenn ich das nicht tun müsste wüsste ich wie es geht.... würd das persönlich niemals so machen.
    aber es is leider so gefordert... ja ich weis nicht 2D array sondern pointer auf pointer...



  • Gästelein schrieb:

    Also ich hab ein

    int **array;
    

    welches ich in einer extra Funktion allokieren muss.

    die Funktion ist bereits definiert mit

    void alloc(int*** array)
    

    so und nun meine Frage, wie muss ich hier mein 2D array richtig übergeben und vorallem dann wie spreche ich das array in der alloc fkt richtig an und allokier es dann richtig ?

    Aufruf:
    alloc(&array);

    in der Funktion:
    *array = malloc(...


  • Mod

    Belli schrieb:

    Aufruf:
    alloc(&array);

    in der Funktion:
    *array = malloc(...

    Und jetzt zeig mal noch, wie du DAS benutzen möchtest. Denk dran, dass array[i][j] hier (in absoluten Zahlenwerten ausgedrückt, keine Pointerarithmetik!) folgendes ist:
    (Adresse von array + i * Größe von Zeiger), dereferenziert; (dereferenzierter Wert + j * Größe von int), derferenziert.



  • ICH will das gar nicht benutzen, ich habe mir auch über Sinn und Unsinn keine Gedanken gemacht, ich habe lediglich versucht, die Frage des TEs zu beantworten.



  • jo die allokierung hab ich inzwischen geschafft.

    und den sinn siehst im ersten post, das ne übung für die uni, bei der ich aber probleme hatte und deshalb hier gefragt habe.

    und zum letzten post von seppj, wir sollen es einmal mit den indexes machen also mit [][], und das selbe dann ohne diese, das is der zweite teil dieses beispieles.

    ob es schluss endlich wirklich etwas sinnvolles tut is zu bezweifeln, aber soll halt pointer und deren verwaltung beibringen oder so


  • Mod

    Aber mein Punkt ist doch, dass das falsch ist! Guck nochmal in deine Unterlagen, da ist das sicher erklärt. Das ist doch gerade einer der Knackpunkte an 2D-Arrays, der hier wohl vermittelt werden soll.



  • Ist das hier denn falsch?

    #include <stdio.h>
    #include <stdlib.h>
    
    void alloc(int ***array)
    {
    	int i,a, v = 0;;
    
    	*array = malloc(10 * sizeof(int*));
    
    	for(i = 0; i < 10; ++i)
    		(*array)[i] = malloc(10 * sizeof(int));
    
    	for(i=0; i<10; ++i)
    		for(a=0; a<10; ++a)
    			(*array)[i][a] = v++;
    
    }
    
    int main()
    {
    	int i, a;
    	int **array;
    
    	alloc(&array);
    
    	for(i=0; i< 10; ++i)
    		for(a=0; a< 10; ++a)
    			printf("%d*", array[i][a]);
    }
    

  • Mod

    Belli schrieb:

    Ist das hier denn falsch?

    Das sieht richtig aus (ich habe jetzt nur nach dem Grundprinzip geguckt, weil ich mal annehme, dass du weißt, was du tust und keine dummen Fehler machst). Aber ich gehe sehr stark davon aus, dass der Threadersteller dies nicht so aus deiner ersten Antwort herausgelesen hat.

    Außerdem ist es vermutlich nicht, was der Threadersteller überhaupt mit 2D-Array meint. Dies hier ist eher eine Liste von Arrays.



  • SeppJ schrieb:

    Aber ich gehe sehr stark davon aus, dass der Threadersteller dies nicht so aus deiner ersten Antwort herausgelesen hat.

    Vielleicht hätte ich das in meiner ersten Antwort schon so ausführlich darstellen sollen ... aber ich dachte, es ginge um die richtige Dereferenzierung des übergebenen int*** ...

    SeppJ schrieb:

    Außerdem ist es vermutlich nicht, was der Threadersteller überhaupt mit 2D-Array meint. Dies hier ist eher eine Liste von Arrays.

    Schon klar, aber man kann damit umgehen, wie mit einem statisch angelegten 2D-Array, deshalb vermute ich, dass das gemeint ist - das lässt sich auch so aus den gegebenen Prämissen (int **array und void alloc(int ***array)) schließen.


Anmelden zum Antworten