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