No, there is no difference.
For one, '\0' is not "one byte"; in C, character constants have type int, so '\0' and 0 are 100% equivalent in every context. (You can check this with sizeof: Both sizeof 0 and sizeof '\0' will yield the same value, typically 4 or 8.)
The other reason is explained in the initialization rules of C (in C99 that's 6.7.8 Initialization):
[...]
Otherwise, the initializer for an object that has aggregate or union type shall be a brace-enclosed list of initializers for the elements or named members.
Each brace-enclosed initializer list has an associated current object. When no
designations are present, subobjects of the current object are initialized in order according
to the type of the current object: array elements in increasing subscript order, structure
members in declaration order, and the first named member of a union. [...]
This says the members of the initialization list are used to initialize the fields of a struct or array in order; it doesn't matter how many bytes they have.
If you write
struct foo { double x; };
struct foo var = { 0 };
then 0 (the first initializer value, type int) is used to initialize the first struct field (x, type double). It's as if you had written double x = 0. The effect is that the value of 0 is implicitly converted from int to double and stored in the variable.
Furthermore, if there are fewer initializers than struct or array elements, this rule kicks in:
- 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.
So how does implicit initialization work with static objects?
If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static 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;
- if it is a union, the first named member is initialized (recursively) according to these rules.
This means all not-explicitly-initialized members of an array or struct are implicitly set to 0.