realloc Speicherproblem beim ersten Element unterschiedliche Adressen...



  • struct erg * daten = NULL;
    
    // in schleife
    daten = (struct erg*) realloc (daten, counter * sizeof(struct erg));
    
    1 914212408 || 0x100225c0
    2 914590008 || 0x100a3a38
     ---
    1. 0x100a3a10 0| 
    2. 0x100a3a38 914590008|
    

    eigentlich sollten bei 1 jeweils die Adressen übereinstimmen (so wie bei 2) nur ist das nicht so 😞 Kann mir jemand einen Tipp geben, warum?

    gruß
    Dominik



  • zu wenig informationen.



  • struct erg{
    		long int mat;
                    long long bau;
    		int anzahl;
    		int teile;
    		double flaeche;  
    		double flaeche2;
    };
    
    	int counter = 1;
    	struct erg * daten = NULL;
    
    while(bedingung > 1){
      daten = (struct erg*) realloc (daten, counter * sizeof(struct erg));
      counter++;
    }
    

    Ist jetzt das meiner Meinung nach Relevante. Wenn ich einfach erst bei 2 Beginne (mit Counter) dann funktionierts...



  • Wenn man die bescheidene Frage äußern darf:
    Was gibst Du da aus und vor allem wieso meinst Du sollte es gleich sein? (Ohne diese Informationen, sag mal, sollen wir erahnen was du tust?!)



  • mit realloc stelle ich ja speicher zur verfügung.
    nach dem realloc gebe ich die adresse mit printf(%p aus. Nachher dann nochmal in einer anderen Methode laufe ich Struktur nochmal durch und gebe wieder printf(%p aus.
    Da beim ersten Wert die Adressen unterschiedlich sind, denke ich, dass hier der Fehler/Problem liegt.



  • Gibst du diese Adressen in der Schleife aus? Wenn ja, ist klar, daß die Adresse sich ändern kann - wenn "hinter" dem bisherigen Datenblock nicht genug Platz ist, reserviert realloc einen neuen Bereich und kopiert die vorhandenen Daten dort rein.



  • ah ok, nochmals damit ich sicher bin, dass ich das verstanden habe:
    start bei

    0x100225c0
    

    und dann wird festgestellt, dahinter gibts nicht mehr ausreichend speicher -> gehe zu anderer Speicheradresse.
    Aber warum "verliere" ich dann den ersten Wert? Eigentlich wird ja kopiert (CStoll)?!

    gruß und thx
    dominik



  • An welcher Stelle schreibst/liest du denn diese Werte aus? realloc sollte eigentlich nichts verschlucken, also gehe ich eher davon aus, daß du etwas falsch einträgst: "*daten" ist immer das erste Element des Arrays - um ans Ende des Arrays zu kommen, mußt du "daten[counter-1]" verarbeiten.



  • gruppen[counter].mat = atoi(daten[s].mat);
    gruppen[counter].bau = atol(daten[s].bau);
    

    counter zähle ich ja immer hoch, also am anfang ist der bei 1



  • freakx0 schrieb:

    counter zähle ich ja immer hoch, also am anfang ist der bei 1

    Und da haben wir den Fehler - der Index beginnt bei 0, also mußt du das Element "gruppen[counter-1]" bearbeiten (gruppen[counter] liegt außerhalb des Bereiches, den realloc() dir reserviert hat).



  • OHJA, sorry, dass ich dich (euch) so lange beansprucht habe, hätte mehr Source posten sollen...

    nochmals vielen lieben dank!

    gruß
    Dominik


Anmelden zum Antworten