C Dynamische Speicherverwaltung in Arrays

azdr

Lieutenant
Registriert
Feb. 2005
Beiträge
685
Hallo leute,

ich hab da ein Problem mit der Verständnis von dynamischen Speichern.

Z.b Wenn ich das triviale Programm hier ausführe stürzt es ab, weil es versucht in den undefinierten array Bereich zu schreiben, das ist mir klar.

Aber ist nicht Sin und Zweck der dynamischen Speicherverwaltung das er autmoatisch erkennt das ich mehr Speicher brauche und dann zuweist!

weil was habe ich davon wenn ich manuel sagen muss dass ich noch mehr speicher brauche.

ich könnte das dann gleich einfach statisch mit arraydym[100000]; definierenm weil ich sehe da irgendwie keinen vorteil.


ich hoffe ihr könnt mir weiterhelfen
danke


Code:
#include <stdio.h>
#include <stdlib.h>

 int main(void) 
{
   
   int i=0,y;
   int *arraydym;

   arraydym = (int *)malloc(sizeof(int));

  
   if(arraydym != NULL) 
   {
          for (y=0;y<100;y++)
         {
            
            arraydym[y]=i++*2;

            printf("%ld\n",arraydym[y]);
         }
    }

    else
    {
       printf("Nicht genug speicher");
    }
    
   
   
   
   system("Pause");
}
 
azdr schrieb:
Aber ist nicht Sin und Zweck der dynamischen Speicherverwaltung das er autmoatisch erkennt das ich mehr Speicher brauche und dann zuweist!
Nein. Denn es ist nur dynamischer Speicher, das heißt du darfst zur Laufzeit neuen Speicher anfordern. Mit einer Speicherverwaltung im Sinne, dass dir irgendwer immer genug Speicher besorgt, hat das nichts zu tun. Wenn du mehr Speicher brauchst, muss du mehr Speicher anfordern.

ich könnte das dann gleich einfach statisch mit arraydym[100000]; definierenm weil ich sehe da irgendwie keinen vorteil.
Wenn du erst zur Laufzeit weißt, dass du Speicher für 100001 Elemente brauchst, musst du dir dynamisch Speicher auf dem Heap anfordern. Ein einfaches Beispiel wäre das Einlesen einer Textdatei mit einer unbekannten Anzahl an Zeichen, da nützt es dir wenig, wenn du statisch Speicher für 1000 Zeichen reserviert.
 
Zuletzt bearbeitet:
OK. jetzt ist mir so einiges klar!.

Eine Frage hätte ich bevor ich mich aufs Ohr haue.
Muss ich wenn ich zur Laufzeit Speicher anfordere unbedingt realloc (); verwenden. oder kann ich auch calloc(); verwenden.

z.b unten das Programm könnte ich es so machen, oder macht man das üblich mit realloc(). weil funktionieren tuts ja.

Code:
int main(void) 
{
   int i=0,y;
   int max=10;
   int *array;

   array = (int *)calloc(max, sizeof(int));

    if(array == NULL) 
    {
        printf("Error!");

    }    
        
    for (y=0;y<100;y++)
    {

            if (array[y]!=NULL)
            {
                max=max+2;
                array =calloc (max, sizeof(int));     // Hänge 2 Arrayplätze hinten an und initiallisiere mit  NULL        
            }

            array[y]=i++;
            printf("%ld\n",array[y]);
    }   

   
   system("Pause");
}
 
azdr schrieb:
Muss ich wenn ich zur Laufzeit Speicher anfordere unbedingt realloc (); verwenden. oder kann ich auch calloc(); verwenden.
Nein, nur wenn du calloc verwendest und den Speicher nicht vorher freigibst hast du ein Speicherleck. Auch scheint dir nicht klar zu sein, das calloc macht.
Code:
 if (array[y]!=NULL)
Damit willst du offenbar testen, ob du am Ende angekommen bist. Das ist eine schlechte Idee, erstes greift man nicht auf Speicher zu, der einem nicht gehört und zweitens hast du keine Garantie dass an der Stelle nicht zufällig doch eine Null ist. Dann würde der Test nicht klappen, also speichere irgendwo extra wie groß dein aktuelles Array ist und benutze diesen Wert.
Code:
            {
                max=max+2;
                array =calloc (max, sizeof(int));     // Hänge 2 Arrayplätze hinten an und initiallisiere mit  NULL        
            }
Nein. Du reserviert Speicher für ein völlig neues Array und schmeißt den Pointer auf das alte Array inkl. aller Inhalte weg. Das existiert aber noch fröhlich weiter da du seinen Speicher nicht explizit freigegeben hast. -> Speicherleck. Entweder du nimmst realloc oder du kopierst das alte Array in das neue und löscht danach das alte.
 
Zuletzt bearbeitet:
OK jetzt ist mir so einiges klarer, danke für die Hilfe.
 
Zurück
Oben