The both code snippets are invalid.
In the first code snippet the array has the automatic storage duration and it is not initialized. So its elements have indeterminate values. As a result the program has undefined behavior.
In the second code snippet there is used an invalid construction to initialize an array
int arr[4] = {};
you may not use empty braces in C (though it is valid in C++). This construction can be a specific compiler extension of C. A correct initialization will look like
int arr[4] = { 0 };
When there are less initializes than the number of initialized elements then the elements that have no explicit initializers are zero-initialized.
From the C Standard (6.7.9 Initialization)
21 If there are fewer initializers in a brace-enclosed list than there
are elements or members of an aggregate, or fewer characters in a
string literal used to initialize an array of known size than there
are elements in the array, the remainder of the aggregate shall be
initialized implicitly the same as objects that have static storage
duration.
and
10 If an object that has automatic storage duration is not initialized
explicitly, its value is indeterminate. If an object that has static
or thread storage duration is not initialized explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or
unsigned) zero;
— if it is an aggregate, every member is initialized (recursively)
according to these rules, and any padding is initialized to zero bits;
— if it is a union, the first named member is initialized
(recursively) according to these rules, and any padding is initialized
to zero bits;
So in this declaration the first element of the array is initialized explicitly by 0 and all other elements of the array are initialized implicitly by the compiler with 0.
In C such an initialization
int arr[4] = { 0 };
is equivalent to the following form of initialization
int arr[4] = { [0] = 0 };
or for example to the following form
int arr[4] = { [3] = 0 };
or you even may omit the number of elements in the array declaration as for example
int arr[] = { [3] = 0 };
That is all elements that have no explicit initializer will be zero-initialized.