wieder mal wilde Zeigerexperimente



  • auch falsch darum gelöscht



  • ob du T* oder T** hast, ist von der logik egal.
    ich habe nicht ganz verstanden was du willst, aber wenn du mit T** klar kommst, dann ist T*** ein klacks.

    warum? ganz einfach:
    mach doch ein typedef

    typedef T* MyT;

    das ganze natuerlich in gedanken. so kannst du auch viele indirektionen recht simpel loesen.
    Weil du jetzt ganz normal

    void f(MyT* p)
    {
      p=malloc(10*sizeof(MyT));
    }
    

    schreiben kannst, und es wirkt alles 'normal' 🙂

    wobei es wohl bessere waere, irgendwie weniger zeiger zu bekommen. ein T*** ist naemlich schon ein bisschen viel 😉



  • war müll



  • Woher weiß eigentlich free() wie groß denn der Speicherbereich ist den es freigeben muss? Der Zeiger der die Anfangsadresse des Speicherbereichs aufnimmt enhält ja keine Infos über die Größe. Und wenn ich Speicher in einer Funktion anforder was ist wenn ich die Funktion verlasse?

    Kann ich das machen? Oder bekomme ich Speicherlücken oder schreibe ich in nicht reservierten Speicher

    int* speicher1()
    {
    return malloc(100*sizeof(int));    
    }
    
    int main(int argc, char *argv[])
    {
        int i=0;
        int *ip = speicher1();
        for(i=0;i<100;i++)
            {
            *(ip+i)=i;
            printf("%i\n",ip[i]);
            }
        free(ip);
    
      system("PAUSE");	
      return 0;
    }
    

    Insbesondere das mit der allocation in der Funktion und der Rückgabe des Wertes mit der Zuweisung an den Pointer in der main Funktion interessiert mich.



  • Lazarus schrieb:

    Woher weiß eigentlich free() wie groß denn der Speicherbereich ist den es freigeben muss? Der Zeiger der die Anfangsadresse des Speicherbereichs aufnimmt enhält ja keine Infos über die Größe.

    der zeiger zeigt zwar auf das erste byte das man benutzen darf (zeiger+0), aber dahinter, zeiger-1...zeiger-x befindet sich eine struct, die den heap-block beschreibt.

    Lazarus schrieb:

    Und wenn ich Speicher in einer Funktion anforder was ist wenn ich die Funktion verlasse?

    der speicher bleibt erhalten. nur alle lokalen variablen sind weg, aber das ist ja egal. wen man nur einen lokalen pointer auf den speicher hatte, kann man nach verlassen der funktion natürlich nicht mehr drauf zugreifen, aber 'gefreed' wird der speicher nicht automatisch.

    Lazarus schrieb:

    Insbesondere das mit der allocation in der Funktion und der Rückgabe des Wertes mit der Zuweisung an den Pointer in der main Funktion interessiert mich.

    das geht. der pointer auf den speicher wird von der funktion zurückgegeben und der aufrufer kann den speicher benutzen, muss ihn aber selber freigeben (machst du ja auch so)



  • Danke für die ausführliche Antwort

    cu


Anmelden zum Antworten