Seite 1 von 2

realloc-Probleme

Verfasst: Do Jan 05, 2012 9:49 am
von Bruno
Hallo!

Ich habe aktuell ein merkwürdiges realloc Problem..

Listing:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 

int main (void)
{
int i = 0;
int *array;

array = (int*) malloc(1*sizeof(int));

for (i=1;i<=10000;i++){
  printf("Index %d\n",i);
  array = (int *) realloc(array,sizeof( int ) * i);
  array[i]=i;
}

return EXIT_SUCCESS;
}

Der Code liefert bei mir dann folgenden Output:

837$: realloc
Index 1
Index 2
Index 3
Index 4
Index 5
Index 6
Index 7
*** glibc detected *** realloc: realloc(): invalid next size: 0x0000000000762010 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3467a748f4]
/lib64/libc.so.6(realloc+0x102)[0x3467a753e2]
realloc[0x400576]
/lib64/libc.so.6(__libc_start_main+0xf4)[0x3467a1d994]
realloc[0x400479]


Ich meine, daß ich malloc und realloc korrekt (laut Lehrbuch) implementiert habe... ist die glibc buggy???

Ciao

Bruno

Re: realloc-Probleme

Verfasst: Do Jan 05, 2012 10:34 am
von Kerli
Bruno hat geschrieben:Ich meine, daß ich malloc und realloc korrekt (laut Lehrbuch) implementiert habe... ist die glibc buggy???
Ich weiß nicht aus welchem Lehrbuch du das hast, aber wenn es wirklich genau gleich drinnen ist, ist es falsch :P Die glibc hat zwar sicher Bugs, aber im Normalfall liegt der Fehler eigentlich immer im eigenen Code.

Schau dir einmal genau an wie groß das Array ist und wo du hinschreibst. Die Speicherverwaltung für den Heap schreibt nämlich an den Anfang oder Ende jedes (durch malloc/realloc) reservierten Speicherbereiches zur Verwaltung benötigte Daten. Nachdem du über die angeforderte Größe hinaus schreibst, überschreibst du diese Informationen und wenn du Glück hast bemerkt das die Speicherverwaltung und teilt es dir mit.

Re: realloc-Probleme

Verfasst: Do Jan 05, 2012 11:15 am
von Bruno
Hallo!

Lt. Lehrbuch sieht der Code so aus:

Code: Alles auswählen

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

int main(void) {
	int *memptr;
      int i;
	memptr = (int *) calloc(100 , sizeof(int));
	if(memptr == NULL) {
		printf("\nNicht genuegend Speicher!");
		exit(1);
	}
	printf("\nSpeicher fuer 100 int-Variablen ok!\n");
      
	for (i=1;i<=25;i++){
        memptr =(int *) realloc(memptr ,sizeof( int ) * 100+i);
	  if(memptr == NULL) {
		  printf("\nNicht genuegend Speicher!");
	  	  exit(1);
	  }
        memptr[i]=i;
      }
	printf("\nSpeicher auf 125 Variablen vergroessert!");
	free(memptr);
	printf("\nSpeicherplatz wieder freigegeben!");
      return(0);
}
Der funktioniert auch bei mir. Ich sehe aber jetzt keinen Unterschied zu meinem Code...

Ciao

Bruno

Re: realloc-Probleme

Verfasst: Do Jan 05, 2012 11:25 am
von Xin
Bruno hat geschrieben:Lt. Lehrbuch sieht der Code so aus:

Code: Alles auswählen

      for (i=1;i<=25;i++){
        memptr =(int *) realloc(memptr ,sizeof( int ) * 100+i);
	  }
        memptr[i]=i;
Dein Code:

Code: Alles auswählen

  array = (int *) realloc(array,sizeof( int ) * i);
  array[i]=i;
Der funktioniert auch bei mir. Ich sehe aber jetzt keinen Unterschied zu meinem Code...
Da sehe ich aber einen größeren Unterschied. Du nimmst i Elemente und schreibst dahinter.

Das Lehrbuch nimmt 100 + i/4 ints, bzw. i/8 ints - je nachdem, ob Du ein 32 oder 64 Bit System hast. Vorsichtig ausgedrückt - so wirklich sinnvoll sieht das auch nicht aus. ^^
In jedem Fall nimmt das Lehrbuch minimal 100 Ints und damit passt das.

Re: realloc-Probleme

Verfasst: Do Jan 05, 2012 12:17 pm
von Bruno
Hallo!
Xin hat geschrieben:Das Lehrbuch nimmt 100 + i/4 ints, bzw. i/8 ints - je nachdem, ob Du ein 32 oder 64 Bit System hast. Vorsichtig ausgedrückt - so wirklich sinnvoll sieht das auch nicht aus. ^^
Abgesehen von der Sinnhaftigkeit gewisser Lehrbuchbeispiele (ich habe mein Abtippen einen Fehler gemacht, jetzt klappt das Lehrbuchbeispiel auch nicht... ) will ich ja "nur" das Array jeweils um 1*sizeof(int) vergrößern, wenn ich einen weiteren Wert abspeichern will.

Da will ich erstmal gar nicht so recht daran glauben, daß ich da in der Memory Map und dem Heap rumgraben muß damit es klappt.

Das realloc klappt ja auch, nur, wenn ich dann einen Wert ablegen will rummst es.
Und das schon beim 8. Wert...

Alternativ kann ich zwar auch ein statisches Array definieren, aber wenn das mal größenmäßig nicht klappt läuft mir wieder das Telefon heiß...

Ciao

Bruno

Re: realloc-Probleme

Verfasst: Do Jan 05, 2012 12:38 pm
von Xin
Bruno hat geschrieben:Das realloc klappt ja auch, nur, wenn ich dann einen Wert ablegen will rummst es.
Womit Du Deine Frage quasi beantwortet hast.

Dein Verständnis scheitert an einem anderen Punkt.
Bruno hat geschrieben:Und das schon beim 8. Wert...
Erst. Nicht schon.

Vielleicht ein kleiner Hinweis. Die meisten Betriebsysteme geben bei der Speicherreservierung eine gerade Zahl von Bytes an. Auch wenn Du nur 1 Byte haben möchtest, gibt Dir das Betriebsystem mehr, um eine Speicherfragmentierung zu verringern.

Gib Dir mal die Adresse aus, die Du bei Relloc reingibst und rausbekommst. Ich vermute, dass sich die Adresse nie ändert. Und dann gib Dir mal die Adresse aus, wo Du hinschreibst.

Re: realloc-Probleme

Verfasst: Do Jan 05, 2012 1:21 pm
von Bruno
Hallo!
Xin hat geschrieben:Gib Dir mal die Adresse aus, die Du bei Relloc reingibst und rausbekommst. Ich vermute, dass sich die Adresse nie ändert. Und dann gib Dir mal die Adresse aus, wo Du hinschreibst.
Nein, die Adresse ändert sich und zwar immer um sizeof(int) = 4 Bytes.

Aber die Adresse in die ich speichere ist anders... damit ist zwar die Frage beantwortet, warum das Wertezuweisen nicht klappt.

Aber näher an die Problemursache bin ich damit noch nicht gekommen.

Re: realloc-Probleme

Verfasst: Do Jan 05, 2012 1:54 pm
von Xin
Bruno hat geschrieben:Hallo!
Xin hat geschrieben:Gib Dir mal die Adresse aus, die Du bei Relloc reingibst und rausbekommst. Ich vermute, dass sich die Adresse nie ändert. Und dann gib Dir mal die Adresse aus, wo Du hinschreibst.
Nein, die Adresse ändert sich und zwar immer um sizeof(int) = 4 Bytes.

Aber die Adresse in die ich speichere ist anders... damit ist zwar die Frage beantwortet, warum das Wertezuweisen nicht klappt.
Die Adresse, wo Du hinschreibst sollte auch immer anders sein - eben um 4 (bzw. 8) Bytes verschoben. Die Adresse, die Dir malloc rausrückt sollte sich nicht ändern.

Wirf das Programm mit den Änderungen zur Ausgebe nochmal hier rein und auch die Ausgaben.
Bruno hat geschrieben:Aber näher an die Problemursache bin ich damit noch nicht gekommen.
Wo beginnt der C-Programmierer mit dem Zählen? ^^

Re: realloc-Probleme

Verfasst: Do Jan 05, 2012 4:08 pm
von Bruno
Xin hat geschrieben:Wo beginnt der C-Programmierer mit dem Zählen? ^^
OK, jetzt hab ich es... hätten wir aber auch einfacher und kürzer haben können...

Re: realloc-Probleme

Verfasst: Do Jan 05, 2012 4:13 pm
von Xin
Bruno hat geschrieben:
Xin hat geschrieben:Wo beginnt der C-Programmierer mit dem Zählen? ^^
OK, jetzt hab ich es... hätten wir aber auch einfacher und kürzer haben können...
Jow, hätten wir und in drei Wochen hättest Du den Fehler wieder gemacht.

Es ist ein Unterschied, ob ich Dir auf die Stirn haue oder Du das selbst machst und die Erfahrung sollst Du bitte selbst machen. Weil Kerli und ich diese Erfahrung schon gemacht haben, schauen wir auf den Quelltext und sehen das Problem sofort. Da bist Du jetzt auf jeden Fall schon einen Schritt weiter und das hilft Dir mehr, als wenn ich Dir nur vorbete, die Du richtig programmierst.

PS: Abgesehen davon hast Du hier noch etwas gelernt: printf() einfügen und Fragen an das Programm zu stellen, ob es sich entsprechend Deinen Erwartungen verhält. Bei richtig großen Programmen kann Dir kein Forum mehr helfen, außer Du veröffentlichst alles und findest jemand, der sich die Zeit dafür nimmt, das durchzusehen.