Liste
-
Prüfe die mallocs und ermittle die Crashzeile!
-
Fuer die Mallocs hab ich jetzt ueberall ne Fehlerabfrage drinnen aber die werden nicht ausgegeben??
#include <stdio.h> #include <stdlib.h> #include <string.h> struct word { char *w; int spam; int ham; struct word *next; }; int main() { FILE *fp; char *file = "file.txt"; fp = fopen(file, "r"); if (fp == NULL) { printf("ERROR opening file"); exit(1); } struct word *begin = NULL; struct word *cursor; char *tmp = malloc(sizeof(char) * 100); int a, b; int k = 0; while(k<2105) { cursor = malloc(sizeof(struct word)); if (cursor == NULL) { printf("NO MEMORY"); exit(1); } cursor->next = NULL; fscanf(fp, "%s %d %d", tmp, &a, &b); cursor->w = malloc(sizeof(char) * 100); if (cursor->w == NULL) { printf("NO MEMORY"); exit(1); } strcpy(cursor->w, tmp); cursor->spam = a; cursor->ham = b; cursor->next = begin; begin = cursor; k++; } while (cursor != NULL) { printf("%s\n", cursor->w); cursor = cursor->next; } fclose(fp); return 0; }
-
Sry funktioniert immer noch nicht...
-
Wahrscheinlich Überlauf beim printf. Schreibe statt printf mal mit fprintf in eine Datei und lasse die Ausgabe auf stdout komplett weg.
-
Den Teil hab ich schon mal ausgeklammert hat aber nix gebracht...
-
Stürzt das Programm immer in Zeile 2106 ab oder auch in anderen? (du hast jetzt bei malloc 100, vorher 30)
Welches Betriebssystem und Compiler verwendest du?
Probier mal strncpy aus.
-
Ja das mit Malloc hab ich mal kurz geaendert und jetzt laeufts nur mehr bis ca 1122...
Betriebssystem Linux Ubuntu 11.04, Compiler gccstrncpy gibt nur das gleiche Ergebnis...
-
An der ersten Schleife liegt es nicht, es liegt wie gesagt am Überlauf von stdout durch zu viele printf.
-
Das kann glaub ich nicht sein denn wenn ich die printf ausklammere krieg ich immer noch nen Segmentation Fault...
#include <stdio.h> #include <stdlib.h> #include <string.h> int count; struct word { char *w; int spam; int ham; struct word *next; }; int main() { count = 0; FILE *fp; char *file = "file.txt"; fp = fopen(file, "r"); if (fp == NULL) { printf("ERROR opening file"); exit(1); } struct word *begin = NULL; struct word *cursor; char *tmp = malloc(sizeof(char) * 50); int a, b; int k = 0; while(k<100000) { cursor = malloc(sizeof(struct word)); cursor->w = malloc(sizeof(char) * 50); if (cursor == NULL) { printf("NO MEMORY"); exit(1); } cursor->next = NULL; fscanf(fp, "%s %d %d", tmp, &a, &b); strncpy(cursor->w, tmp, strlen(tmp)); cursor->spam = a; cursor->ham = b; count++; cursor->next = begin; begin = cursor; k++; } /* while (cursor != NULL) { printf("%d %d\n", cursor->spam, cursor->ham); cursor = cursor->next; } */ fclose(fp); return 0; }
-
Benutze das strncpy richtig.
strncpy(cursor->w, tmp, 50);
wenn cursor->w Platz für 50 Zeichen hat.
Das strlen bekommt strncpy schon hin. Du mußt angeben wie viel Platz in deinem Puffer ist. Ich weiß allerdings gerade nicht wie das mit dem abschließenden '\0' ist,wenn die Pufferlänge erreicht wird.
Sinnvoller wäre auf alle Fälle das tmp richtig groß zu machen und dann
cursor->w = malloc(strlen(tmp)+1);
-
Ok habs jetzt so gemacht nur krieg ich jetzt folgenden Fehlercode:
#include <stdio.h> #include <stdlib.h> #include <string.h> int count; struct word { char *w; int spam; int ham; struct word *next; }; int main() { count = 0; FILE *fp; char *file = "file.txt"; fp = fopen(file, "r"); if (fp == NULL) { printf("ERROR opening file"); exit(1); } struct word *begin = NULL; struct word *cursor; char *tmp = malloc(sizeof(char) * 200); int a, b; int k = 0; while(fscanf(fp, "%s %d %d", tmp, &a, &b) != EOF) { cursor = malloc(sizeof(struct word)); cursor->w = malloc(strlen(tmp)+1); if (cursor == NULL) { printf("NO MEMORY"); exit(1); } cursor->next = NULL; strncpy(cursor->w, tmp, 200); cursor->spam = a; cursor->ham = b; count++; cursor->next = begin; begin = cursor; } while (cursor != NULL) { printf("%d %d\n", cursor->spam, cursor->ham); cursor = cursor->next; } fclose(fp); return 0; }
Fehler:
SPAM: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char
&((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
-
Hab deinen letzten Quelltext kurz durch den gcc und den dm laufen lassen.
Ergebnis kein Fehler beim Compilieren und Linken.Keine Ahnung warum das bei dir anders aussieht
Du reservierst mehrmals Speicher. Da ist es nicht schlecht den auch freizugeben.
Deine Quelltext-Formatierung erscheint mir ein wenig eigenwillig
Aber da gibt es ja verschiedene Ideen.Nimm statt des Code-Button den C/C++-Button dann geht das auch in Farbe
MfG f.-th.
-
Jetzt hats funktioniert hab den Speicher einfach mal auf 250 hochgedreht!!
Danke allen fuer die Hilfe!!
-
Mit richtig groß meinte ich hier etwa 5000 - 10000 Byte
Und wenn du jetzt malloc mit strlen machst, den ist der Puffer der kopiert werden darf auch nur strlen groß.
char *tmp = malloc(sizeof(char) * 200); .... cursor->w = malloc(strlen(tmp)+1); ... strncpy(cursor->w, tmp, strlen(tmp)); // oder strcpy
Da es ja bei anderen funktioniert kann mMn der Fehler eigentlich nur bei deinem "file.txt" oder bei deinem Alpha-Ubuntu 11.04 sein.
-
Typ222 schrieb:
Jetzt hats funktioniert hab den Speicher einfach mal auf 250 hochgedreht!!
Danke allen fuer die Hilfe!!Na OK, ein bißchen größer hat gereicht.