My program reads in people from a file and saves their information to a Person structure that looks like this:
struct person
{
char *fname;
char *lname;
int id;
};
typedef struct person Person;
These people are held in an array of Persons and the function to fill that array looks like this (the total variable is the total number of Persons counted from the file):
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;
}
I cleanup all my memory used and I calloc for the '\0' at the end of the temp strings. Not sure why I get these errors:
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)
Thank you for the help. I have looked through several threads and most of them are about not calloc/mallocing for the '\0' at the end of chars. I do this however I still get these errors and many more when I sort the Person array with qsort(). I apologize if this is the same problem that has been asked before, I could not find the thread.
You're using the wrong length for the allocation of the second part,
fscanf(fin, "%s", temp2);
p[i].lname = (char *) calloc(strlen(temp)+1, sizeof(char));
strcpy(p[i].lname, temp2);
That should use strlen(temp2);
there.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With