Hallo programmeurs,
Ik ben sinds kort van java overgestapt naar C, maar ben nu al de hele dag bezig om uit te zoeken waarom mijn heap corrupt raakt.
Even wat algemene informatie over mijn programma, ik moet een woordenboek console applicatie maken in C die een .txt file kan uitlezen en dit op slaat in een structarray die het volgende bevat:
De grootte van de array moet dynamisch zijn, dus wordt er in de main() een malloc aanroep gedaan om alvast wat geheugen te reserveren:
Nu heb ik een functie geschreven die een woord toevoegt aan de dictionary, dit doet hij door eerst een realloc aanroep te doen en dan vervolgens de nieuwe plek te vullen met het nieuwe woord + vertaling:
Dit werkt prima! Als ik hardcoded wat woorden wil toevoegen doet hij dit helemaal geweldig.
Nu wil ik een file uitlezen --> opslaan in een array --> info eruit verwerken (splitten op " ") --> de functie addToDictionary aanroepen.
Ik kan prima alles uitlezen wat in de file zit, splitten doet ie ook goed, maar naardat ik 2 woorden heb toegevoegd en dan aan de 3e begin, crasht het programma en geeft visual studio aan dat het mogelijk een corrupte heap is. Visuals studio opent dan dbgheap.c dus schijnbaar zit er iets met de heap verkeerd.. mijn vraag is wat? Ik zit nu al ruim 4 uur te kijken naar de code, stap voor stap debuggen en ik kom er nog niet uit.
De code voor het uitlezen + toevoegen aan het woordenboek:
Ik ben sinds kort van java overgestapt naar C, maar ben nu al de hele dag bezig om uit te zoeken waarom mijn heap corrupt raakt.
Even wat algemene informatie over mijn programma, ik moet een woordenboek console applicatie maken in C die een .txt file kan uitlezen en dit op slaat in een structarray die het volgende bevat:
C:
1
2
3
4
5
| typedef struct _relation { char word[30]; char translation[30]; }relation; |
De grootte van de array moet dynamisch zijn, dus wordt er in de main() een malloc aanroep gedaan om alvast wat geheugen te reserveren:
C:
1
2
3
4
| relation *dictionary; dictionary = (relation *) malloc(sizeof(relation)); |
Nu heb ik een functie geschreven die een woord toevoegt aan de dictionary, dit doet hij door eerst een realloc aanroep te doen en dan vervolgens de nieuwe plek te vullen met het nieuwe woord + vertaling:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| /** Voeg een element toe aan de dictionary array: - realloc extra geheugen - vul de gegevens in - wordCount verhogen **/ void addToDictionary(relation *dictionary, int **wordCount, char *word, char *translation){ dictionary = realloc(dictionary, ((**wordCount + 1) * sizeof(struct _relation))); // de gegevens invullen vullen strcpy(dictionary[**wordCount].word, word); strcpy(dictionary[**wordCount].translation, translation); //aantal woorden verhogen **wordCount += 1; } |
Dit werkt prima! Als ik hardcoded wat woorden wil toevoegen doet hij dit helemaal geweldig.
Nu wil ik een file uitlezen --> opslaan in een array --> info eruit verwerken (splitten op " ") --> de functie addToDictionary aanroepen.
Ik kan prima alles uitlezen wat in de file zit, splitten doet ie ook goed, maar naardat ik 2 woorden heb toegevoegd en dan aan de 3e begin, crasht het programma en geeft visual studio aan dat het mogelijk een corrupte heap is. Visuals studio opent dan dbgheap.c dus schijnbaar zit er iets met de heap verkeerd.. mijn vraag is wat? Ik zit nu al ruim 4 uur te kijken naar de code, stap voor stap debuggen en ik kom er nog niet uit.
De code voor het uitlezen + toevoegen aan het woordenboek:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| /** open een wordenboek bestand en lees hem uit nu nog max 128 regels! **/ void readDictionaryFile(relation *dictionary, int *wordCount, char *filename){ FILE *file = fopen ( filename, "r" ); int i, j; char content[128][128]; char line[128]; for(i=0; i<128; i++) for(j=0; j<128; j++) content[i][j] = '\0'; for(i=0; i<128; i++) line[i] = '\0'; if ( file != NULL ) { i=0; while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */ { //fixInputEnd(line); strcpy(content[i], line); i++; } for(j = 0; j < i; j++){ char *tmp = &content[j]; char word[30],translation[30]; printf("array ----> %s \n", &content[j]); strcpy(word,strtok(tmp," ")); strcpy(translation,strtok(NULL," ")); addToDictionary(dictionary,&wordCount,word,translation); } fclose ( file ); } else { perror ( filename ); /* why didn't the file open? */ } } |