Answering Q2 first: Initialization to 0 is specified only for variables in particular storage spaces. Local variables inside functions are not specified to be initialized at all.
Having gotten this out of the way, this allows me to speculate about Q1: Why the designers of the C language have designed C that way.
The linker can place all the static (local to the compilation unit) and global symbols into a single memory area which can be easily zeroed out at program startup. That is a very simple concept which covers a lot.
Otherwise, you would need a per type way to define the default values. That could be done as either a prototype memory area containing the default values to be copied or a piece of code which sets a piece of memory to the default values. The concept for the latter exists, is called constructors, and is implemented in the programming language C++. Every time a variable of some type is defined somewhere, there would need to be code for copying the default values or calling the constructor.
C having being designed as a systems language for writing the Unix operating system, I presume that they just wanted to avoid all that complexity in compiler, linker, runtime, etc. If you want a more high level language, you can choose or invent another language. Even if back in the early 1970s, constraints in CPU cycles and memory and storage would probably favour less complex code as well.