Nach realloc - Einträge gleich null?



  • Hallo!

    ich habe ein Problem mit realloc. Und zwar mach ich folgendes:

    int main(int argc, char** argv) {
    
    MeineStruktur *all_strukt =(MeineStruktur*) malloc(sizeof(MeineStruktur)*250);
    
    //fuelle die liste
    fuelleStruktur(all_strukt);
    }
    
    void fuelleStruktur(MeineStruktur *liste) {
    
    int index = 0;
    
    while (abbruch) {
    
    //DO something, hier lese ich Datei zeilenweise ein, aber die Details sind egal
    
    liste[index] = .../neues element  //hier klappt alles super
    index++;
    
    //so hier kommt nun mein problem, ich gucke, ob schon so viele Elemente gespeichert wurden, dass ich mehr Speicher brauche - welchen ich mit reallocate vergrößere
    
    if (index == 250) {
    
    int total = 250*2;
    liste = (MeineStruktur*) realloc(liste, 
                      sizeof(MeineStruktur)*total_num);
    }
    
    //aber nachdem ich mir die liste ausgeben lasse, ist genau nach diesem index alle Einträge gleich null, obwohl sie gelesen werden :S
    }
    
    }
    

    Ich weiss echt nicht was ich hier falsch mache, wieso die Elemente danach alle nur 0 als Eintrag haben :S



  • Ich weiß auch nicht was du falsch machst, da du ja nicht den fehlerhaften Code gepostet hast, denn du hast da total und total_num

    Oder es ist doch der richtige Code, dann hast du den Fehler.



  • DirkB schrieb:

    Ich weiß auch nicht was du falsch machst, da du ja nicht den fehlerhaften Code gepostet hast, denn du hast da total und total_num

    Oder es ist doch der richtige Code, dann hast du den Fehler.

    ah ne, das ist nur ein Tippfehler beim abschrieben gewesen 😞



  • tinchi schrieb:

    //aber nachdem ich mir die liste ausgeben lasse, ist genau nach diesem index alle Einträge gleich null, obwohl sie gelesen werden :S
    

    Du stellst dich an wie der erste Mensch.
    Weißt du was realloc macht?
    Ja, warum wunderst du dich über das Ergebnis?
    Nein, warum verwendest du Sachen, die du nicht kennst?

    realloc gibt im Erfolgsfall einen Gesamtspeicherbereich zurück, der den ursprünglichen Inhalt und anschließend den zusätzlich anforderten Speicherbereich (mit undefiniertem Inhalt) zurückgibt.
    Es ist also völlig normal, dass da nichts für dich Brauchbares steht.



  • 1. Bei malloc casted man den Rückgabewert nicht, das ist nicht nötig und macht nur den Code schwerer zu lesen. Anders als bei C++, da verwendet man direkt new.
    2. int als Index ist eine klasse Idee. Als Angreifer muss ich nur 0x7fffffff leere Zeilen schreiben kann dann den Buffer-Overflow nutzen. Nutz direkt unsigned-Typen, da biste sicher mit.
    3. Ich hoffe, du machst wenigstens eine Plausibilitätsprüfung der Zeilenanzahl und Daten ...
    4. "abbruch" ist nicht definiert.
    5. realloc sorgt dafür, dass die Daten im Speicher erhalten bleiben, wenn du mehr Speicher haben willst. Der Rest bleibt aber undefiniert, wie auch anfangs bei malloc.
    6. Der Code ist unter aller Sau. Einrückung/Indention?

    Solche Sachen lernt man besser direkt von Anfang an, sonst gewöhnt man sich daran, so schlampig zu programmieren und hat dann echte Barrieren im Kopf, wenn man ordentlich programmieren will.


Anmelden zum Antworten