In C, I have read that half-initialized arrays will be filled with zeros for the rest of the elements (irrespective of integer or char arrays).
E.g.:
in
Variables, located in data segment (global and unit scope), are automatically initialised to all zeros.
Stack variables (function and block scope) are filled with garbage unless explicitly initialised, even partially initialised. In case of partial initialisation, reminder is zeroed.
That's by the C standard and all compilers must adhere to it.
The language spec specifies default behavior, however not all compilers implement the defined behavior. A good example of this is that Visual Studio 2008 is the first version of the Microsoft C/C++ compiler that will call the default constructor on uninitialized elements in an array which has been the defined behavior of array initialization since at least the C++ 98 spec.
If you are worried about how your code will behave running on multiple compilers it is better to be safe than sorry and explicitly initialize all values.
If you want to be sure that your code will work with all compilers you should initialize all your array elements just like it:
int arr[10] = {3,0,0,0,0,0,0,0,0,0};
If the number of elements of your array is too high (100 or 10000) the best solution becomes to initialize it dynamicaly at the runtime.
The behaviour is specified by the C Standard. But if you are worried about the behaviour of your specific compiler, why not write a test?
This should work irrespective of which compiler you are using.
This is according to the C standard, and any compiler following the C standard must do this. However, not all compilers are 100% standard compliant, and you'll have to check if yours does this or not, if you're unsure.