If you want to change what the FILE* points to, you need to pass a FILE**. Before you change it, you need to ensure that any file it happens to be pointing to is closed. This also relies on you always setting FILE* variables to NULL after fclose (this, alas, does not happen automatically), so there's a decent chance careless use of this function would call fclose on an already-closed FILE*. But this is probably still better than willfully leaking file descriptors and not flushing files.
void hello(FILE **fp)
{
// This is actually a horrible test. And in general, this is not
// something you should do, but it is better than leaking open
// file descriptors, so, yeah,
if (*fp != NULL) {
fclose(*fp);
*fp = NULL;
printf("Closed file.");
}
if( (*fp = fopen("log","r") == NULL) {
printf("%s", "Error opening file");
}
}