'Are defined strings set to all NULLs?
I could have sworn that I read that a string that was defined but not initialized was set to all NULLs. In other words, that
char string[10];
consisted of 10 null characters, and that
char string[10] = "Kevin";
consists of the letters 'K', 'e', 'v', 'i', 'n' and five nulls.
Is this true:
- Always?
- Sometimes, depending on the compiler?
- Never?
Solution 1:[1]
in other words, that char string[10]; consisted of 10 null characters,
That depends where and on the variable.
char here_yes[10]; // 10 '\0' characters
int main() {
char here_no[10]; // 10 unknown garbage values
static char but_here_also_yes[10]; // also 10 '\0' characters
}
and that char string[10] = "Kevin"; consists of the letters 'K', 'e', 'v', 'i', 'n' and five nulls. Is this true: Always?
Yes. If you partially initialize a string or a variable, the rest is filled with '\0'
or zeros.
char this_has_10_nulls[10] = "";
int main() {
char this_has_ab_followed_by_8_nulls[10] = { 'a', 'b' };
static char this_has_Kevin_followed_by_5_nulls[10] = "Kevin";
}
Solution 2:[2]
If there is no initializer present (as in your first example), then all elements of the array will have indeterminate values. From this C11 Draft Standard:
6.7.9 Initialization
…
10 If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.
However, if you provide any sort of initializer (as in your second example), then any elements in the array that aren't explicitly set will be initialized to zero. From a few paragraphs later in the Standard:
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.
(Note that a char
of static storage duration will be initialized to zero.)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | KamilCuk |
Solution 2 | Adrian Mole |