I found this problem while working on recover.c. My program recovers all the image files, check50 says everything's cool, but when I run Valgrind, it gives me a ton of errors. After some tests, I found where the problem is: fwrite and fclose.
The way my program works is it opens a file, writes an image, closes the file, and repeats. All the files are opened with the same line: FILE* img = fopen(...);
. Then I close the file with fclose(img);
, and then I use again FILE* img = fopen(...);
changing the name of the file, but not the pointer's name, which is always img
. What the error output from Valgrind says is that there is an invalid read by fwrite()
, happening inside a block previously freed by an earlier call to fclose()
.
I also noticed that the output when running the program through Valgrind is different than what I get from running the program alone.
Maybe this is what the man pages for fclose()
are referring to when they say:
The behavior of fclose() is undefined if the stream parameter is an illegal pointer, or is a descriptor already passed to a previous invocation of fclose().
I've read some stack exchange answers saying this way of operating shouldn't be a problem, but I wonder if there is a better way of doing this. Hopefully you can clarify why this is happening and offer a better solution. Thanks.