Program for converting an array of bytes to hexadecimal
Well, aside from the fact that you could just reduce the program to outputting a single string-literal, let's look at it:


Excellent code-formatting. That's far too rare.
The calculation for outstrlen is all kinds of bent. Both middle factors don't make any sense.

sizeof(bytearr) * sizeof(char)   * sizeof(bytearr[0]) * hexlen
size_in_bytes   * bytes_per_byte * bytes_per_byte     * digits_per_byte

Just to be "safe", you zero outstr before overwriting it...
That isn't safe, that's redundant.
There's no good reason to use bzero() and make your program unportable. Just use memset() if you must.
Why do you print into a temporary buffer, only to append it to the output-string?


Print directly into the final destination. No need for an intermediate.
If you build a string bit by bit, don't be Shlemiel The Painter. No need to make a linear algorithm quadratic.

As you immediately exit the program, freeing memory is just busy-work. Still, as I'm not sure what you are trying to learn there, it might be excused.
As an aside, return 0; is implicit for main() in C99+ and C++. Not sure you that's really relevant, but here you go.


Equivalent program (C99+ or C++):

#include &lt;stdio.h&gt;

int main() {
    printf("Hexadecimal string:\n0b343332\n");
}