Valgrind正在输出这个
==7558== Invalid read of size 8
==7558== at 0x109049: delete_all_employees (emp.c:300)
==7558== by 0x108BCB: main (rpt.c:37)
==7558== Address 0x5232760 is 0 bytes inside a block of size
40 free'd
==7558== at 0x4C30D3B: free (in
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7558== by 0x108E15: free_emp (emp.c:175)
==7558== by 0x109044: delete_all_employees (emp.c:299)
==7558== by 0x108BCB: main (rpt.c:37)
==7558== Block was alloc'd at
==7558== at 0x4C31B25: calloc (in
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7558== by 0x108DAE: new_emp (emp.c:143)
==7558== by 0x108C73: add_employee (emp.c:65)
==7558== by 0x108FB9: load_employees (emp.c:272)
==7558== by 0x108BA2: main (rpt.c:28)
Run Code Online (Sandbox Code Playgroud)
而它调用错误的功能就是这个
void delete_all_employees( void ) {
Employee *emp = employees;
while( emp ) {
free_emp(emp);
emp = emp->next;
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么这会给我一个无效的读取大小8
你是自由的emp
,然后试图从中读取.这就是valgrind所抱怨的.
在递增之前将指针保存为单独的变量emp
,然后释放临时值.
while( emp ) {
Employee *tmp = emp;
emp = emp->next;
free_emp(tmp);
}
Run Code Online (Sandbox Code Playgroud)