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
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.