if (*str) {
fun(str+1); // Keeps calling fun with next character as argument
str1[i] = *str;
i++;
}
As long as we have a non-NUL character in *str, code keeps calling fun with (pointer to) next character as argument (and nothing changes due to these callings).
When *str becomes NUL character, function returns str1 and ends, and now control goes to previously called instance of fun(), which assigns character *str to str1[i]. Here *str is last character of string.
So str1 will eventually contain reverse string of str.
Note that, code doesn't insert NUL character explicitly in str1, but since str1 is global variable and so all characters are zero, so str1 is printed correctly.
So option (B) is correct.