Dynamische Speicherverwaltung



  • Hallo, bin zur Zeit beim TZhema "Dynamische Speicherverwaltung".
    Meine Frage:
    Wozu brauche ich die dynamische Speicherverwaltung?

    GhostfaceChilla



  • Der Stack ist begrenzt, der Heap nur durch die Größe des Speichers. Wenn du z.B. Arrays dynamischer Größe haben willst, du die Größe aber nur zur Laufzeit bestimmen kannst, dann brauchst du Speicherverwaltung.

    Edit: Ich poste mal wieder in abgehackten Sätzen...

    Beispiel: Du liest eine Datei ein. Du weißt aber nicht wie viele Zeilen/Zeichen diese hat, nun könntest du sagen diese hat nicht mehr als 100, aber wenn doch hättest du ein Problem. Für diesen Fall hilft die dynamische Speicherverwaltung z.B.



  • Ah aso ok also werde ich schon selbst merken wann ich sie brauche 😉
    Danke 😉



  • Und merk dir folgendes: Verwende den Stack wenn immer möglich (ohne das Programm einzuschränken).

    @hbb: Der Stack ist nicht begrenzt, man kann theoretisch alles stackbasierend machen über Rekursion.



  • aHaSoOk schrieb:

    Und merk dir folgendes: Verwende den Stack wenn immer möglich (ohne das Programm einzuschränken).

    @hbb: Der Stack ist nicht begrenzt, man kann theoretisch alles stackbasierend machen über Rekursion.

    hat nicht das os ein limit und bei überschreiten kommt ein stackoverflow?



  • aHaSoOk schrieb:

    Und merk dir folgendes: Verwende den Stack wenn immer möglich (ohne das Programm einzuschränken).

    @hbb: Der Stack ist nicht begrenzt, man kann theoretisch alles stackbasierend machen über Rekursion.

    Entweder steht da Unsinn oder ich stehe auf dem Schlauch... Stacks gibts doch nur via Hardware (begrenzt und via Assembler nutzbar) oder man muss es programmieren. Und wenn man es programmiert, ist man auf dynamische Speicherverwaltung angewiesen. Oder übersehe ich da was??
    Hier ein Sample, das ich im Netz gefunden habe:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct
    {
      unsigned int* esp;
      unsigned int size;
      unsigned int maxSize;
    } Stack;
    
    Stack * CreateStack( unsigned int maxSize );
    void Push( Stack * stack, unsigned int value );
    unsigned int Pop( Stack * stack );
    void DestroyStack( Stack * stack );
    int isEmpty (Stack *stack);
    int isFull (Stack *stack);
    
    int main ()
    {
    
      Stack *s;
      int i;
    
      s = CreateStack (5);
    
      for (i = 0; i < 10; i++)
        if (!isFull (s))
          Push (s, i);
    
      for (i = 0; i < 10; i++)
        if (!isEmpty (s))
          printf ("Element %d: %u\n", i + 1, Pop (s));
    
      DestroyStack (s);
    
      return 0;
    
    }
    
    Stack * CreateStack( unsigned int maxSize )
    {
      if( maxSize <= 0 )
        return 0;
    
      Stack * stack = (Stack*) malloc( sizeof( Stack ) );
      stack->maxSize = maxSize;
      stack->size = 0;
      stack->esp = (unsigned int *) malloc( maxSize * sizeof (unsigned int));
    
      return stack;
    }
    
    void Push( Stack * stack, unsigned int value )
    {
      stack->esp[stack->size] = value;
      stack->size++;
    }
    
    unsigned int Pop( Stack * stack )
    {
      stack->size--;
      return stack->esp[stack->size];
    }
    
    void DestroyStack( Stack * stack )
    {
        free( stack->esp );
        free( stack );
        stack = NULL;
    }
    
    int isEmpty (Stack * s)
    {
      return (s->size == 0);
    }
    
    int isFull (Stack * s)
    {
      return (s->size == s->maxSize);
    }
    

    Oder gibt es da eine bessere Technik?? 😕


  • Mod

    SaHel schrieb:

    Stacks gibts doch nur via Hardware (begrenzt und via Assembler nutzbar) oder man muss es programmieren.

    Da hast du etwas sehr sehr falsch verstanden.



  • SeppJ schrieb:

    SaHel schrieb:

    Stacks gibts doch nur via Hardware (begrenzt und via Assembler nutzbar) oder man muss es programmieren.

    Da hast du etwas sehr sehr falsch verstanden.

    Dann kläre mich bitte auf ... 🙂


  • Mod

    SaHel schrieb:

    Dann kläre mich bitte auf ... 🙂

    Naja, ist halt einfach nicht so. Stack im Programm hat nichts mit Hardware und Assembler zu tun. Ein Stack ist einfach eine Datenstruktur, nämlich die die dein Beispielprogramm zeigt.

    Der Stack beim Programmieren ist genau so eine Datenstruktur die dein Programm für sich selber erzeugt um Funktionsaufrufe intern zurückverfolgen zu können. Das tut es, weil der Compiler entsprechenden Code für dich erzeugt.

    Es gibt auch Konventionen wie dieser Code aussehen soll, damit man auch Code aufrufen kann der mit anderen Compilern erzeugt wurde. Diese Konventionen sind auch so beschaffen, dass die zugrundeliegende Hardware optimal ausgenutzt wird. Aber es gibt keinen Stack in der Hardware. Die Verwendung von Stack Datenstrukturen an sich und auch die (willkürlich) begrenzte Größe sind reine* Softwaresache. Es macht bloß jeder, weil es ungeheuer praktisch ist.

    *: Da es so verbreitet ist, gibt es auf manchen Architekturen auch eine gewisse Hardwareunterstützung für solche Strukturen.



  • __-- schrieb:

    aHaSoOk schrieb:

    @hbb: Der Stack ist nicht begrenzt, man kann theoretisch alles stackbasierend machen über Rekursion.

    hat nicht das os ein limit und bei überschreiten kommt ein stackoverflow?

    Ja, das sind dann die praktischen Einschränkungen.

    @SaHel: Folgendes Programm macht das gleiche wie deines:

    void stack (int c, int n)
    {
      if (c <= 0) return;
      stack (c - 1, n + 1);
      printf ("Element %d: %u\n", c, n);
    } 
    
    int main ()
    {
      stack (5, 0);
    }
    

    Aber das meinte ich nicht mit dem Tipp "alles auf den Stack".
    Es ging mir vielmehr darum, unnötiges malloc zu vermeiden.



  • Könnte mir noch jemand sagen was genau es mit calloc() und realloc() auf sich hat?
    Komm da nicht so ganz durch ....

    GhostfaceChilla



  • aHaSoOk schrieb:

    Und merk dir folgendes: Verwende den Stack wenn immer möglich (ohne das Programm einzuschränken).

    @hbb: Der Stack ist nicht begrenzt, man kann theoretisch alles stackbasierend machen über Rekursion.

    Totaler Schwachfug, noch unsinniger als JW.



  • GhostfaceChilla schrieb:

    Könnte mir noch jemand sagen was genau es mit calloc() und realloc() auf sich hat?
    Komm da nicht so ganz durch ....

    GhostfaceChilla

    Ist es zuviel verlangt, eine von hunderten Quellen im Netz mit fertigen, wahlweise auch deutschen Beschreibungen zu diesen ANSI C Standardbibliotheksfunktionen zu befragen?


Anmelden zum Antworten