realloc(): invalid pointer
-
void rechteck(void) { int i, x, y; char *output_top = "+", *output_line = "|"; char *corner = "+", *top_mid = "-", *border ="|", *empty = " "; puts("Geben Sie die Breite des Rechtecks an:"); scanf("%d", &x); puts("Geben Sie die Höhe des Rechtecks an:"); scanf("%d", &y); output_top = realloc(output_top, (strlen(output_top) + (strlen(top_mid) * x))); output_line = realloc(output_line, (strlen(output_line) + (strlen(empty) * x))); for(i = 0; i < x-2; i++) strcat(output_top, top_mid); strcat(output_top, corner); for(i = 0; i < x-2; i++) strcat(output_line, empty); strcat(output_line, border); for(i = 0; i < y; i++) { if((i == 0)||(i == y)) { puts(output_top); puts(""); } puts(output_line); puts(""); } return; }
Das Programm soll ein Rechteck auf dem Bildschirm ausgeben.
Ein 4 x 3 Rechteck sollte demnach so aussehen:+--+ | | +--+ Nein das ist kein C/C++ Code. Nur lässt sich anders nichts mit Leerzeichen darstellen.
Dazu füge ich mehrere Strings zusammen, woran der Compiler selbst auch nichts zu bemängeln hat.
Nur wenn ich das Programm ausführe, meldet sich die glibc mit einem Fehler.realloc(): invalid pointer 0x...irgendwas
Dieser Pointer muss irgendwie mit dem ersten Aufruf von realloc() zusammenhängen, da die Adresse - im Debug Modus - auf diese Zeile zeigt.
output_top = realloc(output_top, (strlen(output_top) + (strlen(top_mid) * x)));
Ist am Code irgendwas falsch? Ich seh da nicht mehr durch.
Greetz
-
nicht nur, dass du man: realloc(3) falsch verwendest, du fütterst
realloc
mit einem Pointer, der auf read-only Memory zeigt.realloc
erwartet entwederNULL
oder- einen Pointer auf bereits dynamisch-allozierten Speicher
2. Fehler: du reservierst zu wenig Speicher, \0 fehlt!
-
Ja, jetzt wo du es sagts, springt mich mein Buch geradezu an. "Speicher dynamisch reservieren!" schreit es
Aber Danke für den Tip, ich hätt wahrscheinlich noch ewig gesucht.Bei Punkt 2 muss ich dir allerdings widersprechen.
Das Rechteck hat eine Gesamtbreite von z.B. 5 Zeichen (Angabe des Users, Variable x)
Da der ursprüngliche String schon ein Byte misst (initialisiert mit "+") und um x Byte erweitert wird, hat er im jetzigen Beispiel, 6 Byte.
Der resultierende String nimmt dann noch 5 Byte (inclusive '\0') auf, was auch völlig OK ist.Greetz
-