realloc-Probleme

Schnelle objektorientierte, kompilierende Programmiersprache.
Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

realloc-Probleme

Beitrag von Bruno » Do Jan 05, 2012 9:49 am

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
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: realloc-Probleme

Beitrag von Kerli » Do Jan 05, 2012 10:34 am

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.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: realloc-Probleme

Beitrag von Bruno » Do Jan 05, 2012 11:15 am

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
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: realloc-Probleme

Beitrag von Xin » Do Jan 05, 2012 11:25 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: realloc-Probleme

Beitrag von Bruno » Do Jan 05, 2012 12:17 pm

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
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: realloc-Probleme

Beitrag von Xin » Do Jan 05, 2012 12:38 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: realloc-Probleme

Beitrag von Bruno » Do Jan 05, 2012 1:21 pm

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.
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: realloc-Probleme

Beitrag von Xin » Do Jan 05, 2012 1:54 pm

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? ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Bruno
Beiträge: 41
Registriert: Do Jul 14, 2011 7:04 am

Re: realloc-Probleme

Beitrag von Bruno » Do Jan 05, 2012 4:08 pm

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...
"21" ist nur die halbe Wahrheit...

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: realloc-Probleme

Beitrag von Xin » Do Jan 05, 2012 4:13 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten