Процедура назначения массива C - сразу или индивидуально - Частичное назначение массива - другой вывод

#include <stdio.h>

int main()
{
    int a[5]={1} ;
    int b[5];
    b[0]=1 ;
    printf("\na[0]=%d, a[1]=%d, a[2]=%d, a[3]=%d, a[4]=%d",a[0],a[1],a[2],a[3],a[4]);
    printf("\nb[0]=%d, b[1]=%d, b[2]=%d, b[3]=%d, b[4]=%d",b[0],b[1],b[2],b[3],b[4]);

    return 0 ;
}

Посмотрите на код. Я назначил два целочисленных массива частично (1 элемент из 5) в двух процедурах.

1-й назначается сразу с помощью фигурных скобок.

Второй назначается путем доступа к одному индексу массива.

А потом распечатываю весь массив.

В 1-м массиве я получаю 0 (ноль) в неназначенном индексе. И во втором массиве я получаю значение мусора в неназначенном индексе.

Пожалуйста, объясните.

Пожалуйста, не объясняйте, что здесь происходит. Но любезно объясните, почему это происходит? Причина.


person ANUPAM CHANDA    schedule 12.11.2017    source источник
comment
Нет, там кто-то спрашивал, как назначить элемент sam. Но вот вопрос. Если я не назначу полный массив несколькими способами. Почему ценности различаются. Причина. :)   -  person ANUPAM CHANDA    schedule 12.11.2017


Ответы (2)


С участием

int a[5]={1} ;

вы инициализируете первый элемент как 1, а остальные автоматически инициализируются как 0.

С участием

int b[5];
b[0]=1 ;

вы не инициализируете ни один из элементов, содержимое массива (после определения) будет неопределенным. Затем вы присваиваете значение 1 b[0], оставляя остальную часть массива неинициализированной.

person Some programmer dude    schedule 12.11.2017

Это правильное поведение.

int a[5]={1} ; // 1,0,0,0,0

массив инициализируется этими значениями.

Во втором случае инициализируется только b[0]. Остальные элементы содержат неопределенные значения.

Пример из самого стандарта 6.7.9.27 [N1570]

ПРИМЕР 4 Объявление

      int z[4][3] = {
            { 1 }, { 2 }, { 3 }, { 4 }
      }; 

инициализирует первый столбец z, как указано, а остальные инициализирует нулями.

В том же отрывке стандарта говорится: 6.7.9.21.

Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов агрегата, или меньше символов в строковом литерале, используемом для инициализации массива известного размера чем есть элементы в массиве, остальная часть агрегата должна быть инициализирована неявно так же, как объекты, которые имеют статическую продолжительность хранения.

В правиле этого стандарта упоминается: - 6.7.9.10

Если объект, который имеет автоматическую продолжительность хранения, не инициализирован явно, его значение не определено. Если объект, который имеет статическую продолжительность хранения или продолжительность хранения потока, не инициализирован явно, то:

  • если он имеет тип указателя, он инициализируется нулевым указателем;
  • если он имеет арифметический тип, он инициализируется (положительным или беззнаковым) нулем;
  • если это агрегат, каждый член инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется нулевыми битами;
  • если это объединение, первый именованный член инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется нулевыми битами;
person user2736738    schedule 12.11.2017