Dyn. Array / Array automatisch vergrößern



  • Hallo,

    /* dyn. Speichervergroesserung */
    char ** links;
    links = (char **)malloc(1000*sizeof(int *));
    

    da kann ich im moment 1005 Links abspeichern, ich aber mehr speichern! Wie kann ich dynamisch die größe ändern? Ich schätze, dass ich immer rund 7000 Links habe, kann aber auch mal mehr sein. Wie lösen?

    thx mias



  • realloc du nehmen solltest.



  • char ** links;
    links =(char *)calloc(1000, sizeof(char));
    links = (char *)realloc(links , 5000 * sizeof(char));

    mhh, passt aber nicht wirklich.
    Komme bis 1265 dann STATUS_ACCESS



  • freakx0 schrieb:

    char ** links;
    links =(char *)calloc(1000, sizeof(char));
    links = (char *)realloc(links , 5000 * sizeof(char));

    mhh, passt aber nicht wirklich.
    Komme bis 1265 dann STATUS_ACCESS

    Je nachdem, auf was für einer Architektur Du arbeitest, hat ein Pointer (Link) 4 oder gar mehr Byte, ein char aber i.d.R. nur eins. 4*1265=5060, also hast Du Deinen Speicherbereich aus dem realloc schon heftig überrannt.

    links = malloc(1000 * sizeof(char *));
    links = realloc(links, 5000 * sizeof(char *));
    

    sollte besser gehen. Das casten kannst Du Dir auch sparen, malloc etc. liefern einen void* zurück.



  • danke schön.

    jetzt funktionierts, aber so ganz klar ist mir der sinn noch nicht, da ich immernoch einen Speicherüberlauf bekommen kann.

    links = malloc(1000 * sizeof(char ));
    links = realloc(links , 2000
    sizeof(char *));

    da bekomme ich dann nach 6019 eintraegen wieder meine meldung.

    gruß mias



  • mias schrieb:

    danke schön.

    jetzt funktionierts, aber so ganz klar ist mir der sinn noch nicht, da ich immernoch einen Speicherüberlauf bekommen kann.

    links = malloc(1000 * sizeof(char ));
    links = realloc(links , 2000
    sizeof(char *));

    da bekomme ich dann nach 6019 eintraegen wieder meine meldung.

    gruß mias

    Hallo? Das ist C... Dich schützt niemand davor, Deine Speicherbereiche zu verlassen, und dass es in dem Fall bis 6019 geklappt hat, zeigt nur, dass Deinem Programm hinter den 2000 Pointern noch entsprechend mehr Speicher gehörte; erst als es richtig "in the wild" ging, wurde es gestoppt.
    Du musst Deine eigene Platzverwaltung darüber legen, in der Du z.B. die benutzten Slots der 2000 mitzählst und bei Bedarf ein weiteres realloc() ausführst.
    Du weißt sicherlich, dass Du da char-Pointer allokierst, oder? was speicherst Du denn da? Da muss immer noch ein passendes

    links[bla] = malloc(hastenichtgesehen * sizeof(char));
    

    kommen...



  • naja, ich dachte mit dem realloc und malloc könnte ich das problem "erschlagen".

    dass ich link[posnummer] = malloc noch brauche weiß ich und hab ich auch schon so.

    gruss mias



  • mias schrieb:

    naja, ich dachte mit dem realloc und malloc könnte ich das problem "erschlagen".

    Kannst du dcch auch - du mußt nur darauf achten, wieviel Speicher du tatsächlich hast (wenn du Platz für 2000 Elemente reserviert hast, kannst du nur 2000 Elemente nutzen; wenn du 6000 Elemente brauchst, mußt du entsprechend mehr Speicher anfordern).


Anmelden zum Antworten