Почему в этом массиве все оставшиеся значения инициализируются нулями?
Здравствуйте, я новичок в языке программирования C, недавно я начал изучать массивы, я изучил, что по умолчанию все значения в массиве int являются мусором.
Тогда почему я получаю разные значения в этих двух случаях.
Случай 1
int arr[5];
в этом случае от arr[0] до arr[4] у нас будут значения мусора, но в следующем случае.
Case-2
int arr[5] = {1};
в этом случае arr[0] будет иметь значение 1, а оставшиеся от arr[1] до arr[4] будут иметь значение 0.
Мой вопрос заключается в том, что если в случае-1 в каждом неинициализированном расположении массива имеется мусор, то почему в случае-2 в оставшихся неинициализированных местах массива по умолчанию установлено значение 0.
4 ответа
C11 6.7.9 Инициализация p19 покрывает это (мой акцент)
Инициализация должна происходить в порядке списка инициализаторов, каждый инициализатор предоставляется для конкретного подобъекта, переопределяя любой ранее перечисленный инициализатор для того же подобъекта; 151) все подобъекты, которые не инициализированы явно, должны быть неявно инициализированы так же, как объекты, которые имеют статическую продолжительность хранения.
Раздел 6.7.9 р10 утверждает, что
Если объект, который имеет статическую или потоковую длительность хранения, не инициализируется явно, то... если он имеет арифметический тип, он инициализируется равным нулю (положительный или без знака);
Проект C99 гласит:
Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов агрегата или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве, оставшаяся часть агрегата должна инициализироваться неявно так же, как объекты, которые имеют статическую длительность хранения.
И статические объекты инициализируются нулями.
Таким образом, существует большая разница между отсутствием какого-либо инициализатора, который дает вам неинициализированное содержимое памяти (то, что вы называете "мусором"), и наличием инициализатора. Если инициализатор есть, но отсутствуют данные, вы получите 0 по умолчанию.
Это очень удобно, так как позволяет 0-инициализировать большой массив, выполнив то же, что и вы.
Бит, который вам не хватает, заключается в том, что если вы инициализируете только один элемент массива, остальные его элементы будут автоматически инициализированы равными 0. Язык определяется таким образом.
Из стандарта C, как указано здесь (нажмите на ссылку, вы можете найти более полезную информацию там)
Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов агрегата или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве, оставшаяся часть агрегата должна инициализироваться неявно так же, как объекты, которые имеют статическую продолжительность хранения.