realloc



  • mila schrieb:

    ilist=int* realloc(ilist,count +1);
    

    Zeile ok?

    Fast. Tipp 3. Schau dir das Kapitel "Cast Ausdrücke" in deinem bevorzugten Einsteiger-C++-Buch an.

    Der Code ist von vorne bis hinten Topfen

    Das haben Klausuraufgaben meist so an sich...



  • Und die Zeile *(ilist+count -1)=i; kann man auch so schreiben: ilist[count-1] = i; . Und zur Erinnerung, die Elemente in einem Array kann man immer von arr[0]..arr[count-1] ansprechen 😉

    edit: Richtig, ghorst hat Recht! Indem Beispiel-Code im ersten Post ist das letzte Element natürlich arr[count], weil der Speicher dort ja schon vergrößert wurde, count aber noch nicht erhöht wurde.



  • das mit dem letzten element trifft hier aber nicht zu, da die größe count+1 ist und somit array[count] das letzte element wäre.


  • Mod

    p=realloc(p,...)
    

    ist auch so ein Anti-Pattern eigener Art...
    Eines der Schlimmeren, weil es so unschuldig aussieht.



  • Jetzt muß man nur noch hoffen, daß ein Byte groß genug ist, um einen kompletten int-Wert zu fassen 😉 ('count+1' Integers sind idR etwas größer als die 'count+1' Byte, die mit realloc() angefordert wurden)



  • @CStoll stimmt du hast recht. ich war irgendwie darauf fixziert, dass es ein char-array sein müsste, da sonst der aufruf von realloc mit count+1 keinerlei sinn machen würde.



  • neuer Versuch...

    ilist=(* int) realloc(ilist,count +1);//Typecast, Rückgabetyp int-Zeiger
    
    *(ilist+count -1)=i;
    

    Speicherbereich wird um int 1 erhöht
    und anschließend wird in den vorletzten Speicherbereich der übergebene Wert i eingetragen.
    Hoffe, dass ich es jetzt verstanden habe.



  • Der Cast ist immer noch falsch (Tip: Wie schreibt man den Typ "Zeiger auf int"?) - und die Größe des angeforderten Speichers ist immer noch zu klein (sizeof() hilft).

    btw, der Zugriff auf das letzte Element war schon vorher (relativ) richtig.



  • CStoll schrieb:

    und die Größe des angeforderten Speichers ist immer noch zu klein (sizeof() hilft).

    Um es ein wenig deutlicher zu machen (CStoll spielt gern Geheimniskrämer :p), malloc bzw realloc holen dir Speicher mit so vielen Bytes wie du angibst. Hier wird angegeben, dass count+1 Bytes geholt werden sollen. Da ein int aber größer als ein Byte ist, ist es zuwenig Speicher. sizeof(int) gibt zurück, wieviele Bytes ein int groß ist 🙂



  • Danke für die Hilfe, bin wohl ein ziemlich schwieriger Fall.

    ilist=(int*) realloc(ilist,count+sizeof(int));
    


  • In der Tat, wenn 1 int sizeof(int) Bytes belegt, wieviele Bytes belegen dann n ints? Doch nicht sizeof(int)+n !



  • mila schrieb:

    Danke für die Hilfe, bin wohl ein ziemlich schwieriger Fall.

    ilist=(int*) realloc(ilist,count+sizeof(int));
    

    Nö, du kannst bloss anscheinend weder gut rechnen noch programmieren.
    Lern doch zusammen mit nem Schul-/Studienkollegen, das geht viel schneller, besser, effektiver als hier über ein Forum.



  • mila schrieb:

    Danke für die Hilfe, bin wohl ein ziemlich schwieriger Fall.

    ilist=(int*) realloc(ilist,count+sizeof(int));
    

    scheint so, 😉 ich denke du willst das:

    realloc(ilist,count[u]*[/u]sizeof(int))
    

    ausserdem: beachte auch campers posting. realloc kann schief gehen und dann ist dein pointer futsch.
    🙂



  • Im Zusammenhang muss es dann natürlich (count+1)*sizeof(int) heißen 🙂


Anmelden zum Antworten