Ви отримуєте таку поведінку, оскільки int array [ROW][COLUMN] = {1};
це не означає "встановити всі елементи до одного". Дозвольте мені спробувати пояснити, як це працює поетапно.
Явний, надто зрозумілий спосіб ініціалізації вашого масиву буде таким:
#define ROW 2
#define COLUMN 2
int array [ROW][COLUMN] =
{
{0, 0},
{0, 0}
};
Однак, C дозволяє вилучити деякі елементи з масиву (або структури / об'єднання). Наприклад, ви можете написати:
int array [ROW][COLUMN] =
{
{1, 2}
};
Це означає, що ініціалізуйте перші елементи до 1 і 2, а решту елементів "ніби вони мають статичну тривалість зберігання". У C є правило, яке говорить, що всі об’єкти статичної тривалості зберігання, які явно не ініціалізовані програмістом, повинні мати нульове значення.
Отже, у наведеному вище прикладі перший рядок має значення 1,2, а наступний - 0,0, оскільки ми не надали їм явних значень.
Далі є правило на мові C, що дозволяє розслаблений стиль фігурних дужок. Перший приклад цілком можна написати як
int array [ROW][COLUMN] = {0, 0, 0, 0};
хоча, звичайно, це поганий стиль, його важче читати та розуміти. Але це правило зручне, оскільки воно дозволяє нам писати
int array [ROW][COLUMN] = {0};
що означає: "ініціалізуйте перший стовпець у першому рядку значенням 0, а всі інші елементи так, ніби вони мають статичну тривалість зберігання, тобто встановіть їх на нуль."
тому, якщо ви спробуєте
int array [ROW][COLUMN] = {1};
це означає "ініціалізувати перший стовпець у першому рядку рівним 1 і встановити всі інші елементи на нуль".