В C массив содержит сами значения, а не ссылки на значения. Для вашего int data [20]
в стеке будет выделено 20 слотов, каждый из которых содержит одно значение типа int
. Выделенные слоты не очищаются, поэтому начальные значения элементов массива будут данными, хранящимися в этих слотах стека, кем бы они ни использовались ранее. Назначения, которые вы сделали для элементов массива, такие как data[8] = 1;
, не инициализируют элементы массива, они просто заменяют текущие значения элементов новыми значениями.
Другими словами, все элементы вашего массива инициализируются сразу после объявления массива. В вашем конкретном случае они инициализируются некоторыми значениями мусора из стека. Если вы хотите инициализировать их с какими-то определенными значениями, вы должны использовать инициализатор массива так:
int data[20] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
};
Это относится и к переменным, не относящимся к массиву. В контракте с некоторыми другими языками, такими как Java, вы не можете инициализировать переменную после объявления, но только внутри объявлений. Итак:
int a = 13; // Initialize to 13
int b; // Initialize to garbage from stack
a = 11; // Just assignment, not initialization
b = 17; // Yet another assignment, not initialization