Valgrind plusieurs “invalide de lecture/écriture de taille 1” erreurs
Mon programme lit les personnes à partir d'un fichier et l'enregistre leurs informations à une Personne de la structure qui ressemble à ceci:
struct person
{
char *fname;
char *lname;
int id;
};
typedef struct person Person;
Ces personnes sont détenues dans un tableau de Personnes et la fonction à remplir ce tableau ressemble à ceci (le total de la variable est le nombre total de Personnes recensées dans le fichier):
Person* fillArray(int total, FILE *fin)
{
rewind(fin);
int i;
char temp[50];
char temp2[50];
Person *p = (Person*) calloc(total, sizeof(Person));
for(i = 0; i < total; i++)
{
fscanf(fin, "%s", temp);
p[i].fname = (char *) calloc(strlen(temp)+1, sizeof(char));
strcpy(p[i].fname, temp);
fscanf(fin, "%s", temp2);
p[i].lname = (char *) calloc(strlen(temp)+1, sizeof(char));
strcpy(p[i].lname, temp2);
fscanf(fin, "%d", &(p + i)->id);
}
return p;
}
Je le nettoyage de toutes ma mémoire utilisé et je calloc pour le '\0' à la fin de la temp cordes. Je ne sais pas pourquoi j'obtiens ces erreurs:
HEAP SUMMARY:
==4736== in use at exit: 0 bytes in 0 blocks
==4736== total heap usage: 8 allocs, 8 frees, 414 bytes allocated
==4736==
==4736== All heap blocks were freed -- no leaks are possible
==4736==
==4736== ERROR SUMMARY: 10 errors from 2 contexts (suppressed: 0 from 0)
==4736==
==4736== 3 errors in context 1 of 2:
==4736== Invalid write of size 1
==4736== at 0x402C6E8: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4736== by 0x804898E: fillArray (cscd240_s13_lab11Functions.c:30)
==4736== by 0x8048731: main (cscd240_s13_lab11Tester.c:13)
==4736== Address 0x41ef24f is 3 bytes after a block of size 4 alloc'd
==4736== at 0x402A5E6: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4736== by 0x804896A: fillArray (cscd240_s13_lab11Functions.c:29)
==4736== by 0x8048731: main (cscd240_s13_lab11Tester.c:13)
==4736==
==4736==
==4736== 7 errors in context 2 of 2:
==4736== Invalid write of size 1
==4736== at 0x402C6C3: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4736== by 0x804898E: fillArray (cscd240_s13_lab11Functions.c:30)
==4736== by 0x8048731: main (cscd240_s13_lab11Tester.c:13)
==4736== Address 0x41ef24c is 0 bytes after a block of size 4 alloc'd
==4736== at 0x402A5E6: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4736== by 0x804896A: fillArray (cscd240_s13_lab11Functions.c:29)
==4736== by 0x8048731: main (cscd240_s13_lab11Tester.c:13)
==4736==
==4736== ERROR SUMMARY: 10 errors from 2 contexts (suppressed: 0 from 0)
Vous remercier pour l'aide. J'ai regardé à travers plusieurs threads et la plupart d'entre eux sont sur le pas de calloc/mallocing pour le '\0' à la fin de caractères. - Je faire cela, cependant, je reçois toujours ces erreurs et beaucoup plus quand je sort de la Personne tableau avec qsort(). Je m'excuse si c'est le même problème qui a été demandé avant, je ne pouvais pas trouver le fil.
OriginalL'auteur Austin Johnston | 2013-05-15
Vous devez vous connecter pour publier un commentaire.
Vous utilisez la bonne longueur pour l'attribution de la deuxième partie,
Qui doivent utiliser des
strlen(temp2);
.OriginalL'auteur Daniel Fischer