My program reads people from a file and saves their information in the Person structure, which looks like this:
struct person { char *fname; char *lname; int id; }; typedef struct person Person;
These people are stored in an array of faces, and the function for filling this array looks like this (the common 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 clear all used memory and call calloc for '\ 0' at the end of the temp lines. 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)
Thanks for the help. I looked at several threads, and most of them are not calloc / mallocing for '\ 0' at the end of characters. I do this, however, I still get these errors and more when I sort the Person array using qsort (). I apologize if this is the same problem that I asked before, I could not find the thread.
source share