Firstly, the first variant does not initialize any structure. It simply allocates a block of raw memory sufficient to hold an object of struct Cat
type. The memory remains uninitialized (contains garbage). The second variant does initialize each field in the structure to a specific value.
Secondly, the first variant creates a nameless [and uninitialized] struct Cat
object with allocated storage duration. The object will live until you explicitly deallocate it with free
(or until the program ends). The second variant creates a named object cat
with automatic storage duration - it will be deallocated automatically at the end of its declarative region (at the end of the containing block).
Thirdly, in practice the two variants create objects in different kinds of memory. The first variant creates the object in the heap, while the second variant will typically create it on the stack.
As for when to use one or another, there are quite a few answers here on SO to that question. This thread has some answers and plenty of links.