No, you don't need to free. That memory is allocated by the compiler "statically" or "automatically" (depending on whether or not the declaration is inside a function). In neither case do you need to free it.
Basically remember that, you free things which you malloc. If and only if. No malloc, no free.
So is it a better programming approach?
A lot depends on what you need to do. Say you have a single string, and you know in advance how long it is going to be. Then this is fine:
char p ;
But what if you don't know in advance its size? Then you have a problem. You might allocate a big number, but either it may still be too small, or you are wasting memory (bearing in mind you only have around 2048 bytes to start with).
Another case for dynamic allocation is where you may need more than one batch of it. For example, in a game you might have between 1 and 10 monsters. So you dynamically allocate (malloc) for each monster, and get the memory back (free) when it dies. Something like that.