2016-05-31 7 views
0

neu zu C Programmierer hier. Dieser Code läuft wunderbar, wenn das Training klein ausfällt, aber er stürzt ab, wenn die Reichweite zunimmt. Im Moment bricht es bei 1289 ab, aber ich möchte es bis 7892 verwenden. Der Fehler ist unten; Ich bin mir ziemlich sicher, dass es sich um etwas im Malloc-Call handelt, aber ich bin mir nicht sicher, wie ich es beheben soll. Vielen Dank.Malloc Fehlallokation?

TrainSet* get_train_set(float range){ 
    TrainSet* t; 
    printf("%f\n", range); 
    t = malloc(range * sizeof *t); 
    FILE *fp; 
    char line[300]; /* 300 is an arbitrary length to read in lines from the text file*/ 
    int count = 0; 
    fp = fopen("Data/main_training_set.txt", "r"); 
    if(fp == NULL){ 
     perror("Error opening file"); 
     return NULL; 
    } 
    while (fgets(line, 300, fp)){ 
     // printf("%d\n", count); 
     int s = strlen((line)) - 3; 
     char* quote = (char*)malloc(sizeof(char) * s); 
     for(int i = 0; i <= s; i++){ 
     quote[i] = line[i]; 
     } 
     int label = atoi(&line[s]); 
     t->sentences[count] = quote; 
     t->labels[count] = label; 
     count ++; 
    } 
    //fclose(fp); 
    return t; 
} 

Der Fehler:

buddhism: malloc.c:2372: 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. 
Aborted 

Und hier ist die h-Datei für Triebzug

typedef struct TrainSet { 
    char* sentences[7892]; 
    int labels[7892]; 
} TrainSet; 

TrainSet* get_train_set(float range); 

#endif /* READ_H*/* 

Eingangsdaten sind dies im Wesentlichen, eine verstümmelte Art Satz mit einer ganzen Zahl am Ende jeden Linie.

first four lectures taking place weekendand subject weekends talk five aggregates 1 
relationship us thats simply want tobe happy dont want suffer 1 
heard words songrecently said "i dont mind dying living scaresme 1 
us know difficulties life trying somehowto minimize 1 
+4

Sieht aus wie Sie irgendwo eine Speicherbeschädigung haben. Es ist schwer für uns zu helfen, es sei denn, ein [mcve] wird bereitgestellt. Aber für Anfänger 'für (int i = 0; i <= s; i ++)' Ursachen außerhalb des gebundenen Zugriffs. Es muss "für (int i = 0; i kaylum

+0

Sehen Sie sich mit [getline] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html) anstelle von fgets um. Keine willkürliche Speicherzuordnung notwendig. – Schwern

+0

@Swwern Diese Funktion ist möglicherweise auf Nicht-POSIX-Systemen nicht verfügbar –

Antwort

0

Sie schreiben über das Ende von quote hinaus und schreiben möglicherweise über das Ende von t hinaus.

Diese Schleife:

for(int i = 0; i <= s; i++){ 
    quote[i] = line[i]; 
    } 

schreibt ein char über das Ende des quote.

Und dieser Teil:

t->sentences[count] = quote; 
    t->labels[count] = label; 

prüft nicht, ob count < range.

+0

Danke für den Hinweis @MSN! Das Seltsame daran ist, dass das bei einer kleineren Größe perfekt funktionierte, und jetzt, wo ich es ansehe, kann ich nicht verstehen, warum es so wäre. Du warst absolut richtig. –

+0

Ich glaube, der Grund, warum Sie wahrscheinlich nicht bemerkt haben, ist, weil der Zugriff außerhalb der Grenzen von Arrays in C als undefiniertes Verhalten gilt, also weiß Gott, woran tatsächlich geschrieben wird. – Bauss

3
char* quote = (char*)malloc(sizeof(char) * s); 
    for(int i = 0; i <= s; i++){ 
    quote[i] = line[i]; 
    } 

Angenommen s ist 2. Ihre for Schleife Schleife über 0, 1 und 2. Das in quote drei Räumen ist. Aber da s 2 ist, haben Sie nur Platz in quote für zwei reserviert.

+0

@ user3386109 Vielleicht, aber dann ist es schwer zu erklären, warum er' s' Leerzeichen zugewiesen, (ungefähr) 's' Zeichen kopiert und' atoi' einen Zeiger auf 'Zeile übergeben hat [s] '. Du könntest denken, dass da irgendwo ein -3 drin sein würde. Aber ohne Kommentare (außer einem nicht hilfreichen) und vielen Fehlern ist es sehr schwer, sicher zu sein. –

+0

Ahh, du hast Recht. Es macht jetzt viel mehr Sinn. Guter Fang. (Antwort wird aktualisiert.) –

+0

Entschuldigung für die Verwirrung, die s-Logik wird verwendet, um eine ganze Zahl am Ende jedes einzelnen Zitats zu erfassen und sie einer separaten Liste von Etiketten hinzuzufügen. Die Zitate müssen zu einer Liste von Anführungszeichen hinzugefügt werden. Danke für den Hinweis! Schriftstellerin, übrigens. –