Vous obtenez ce comportement, parce que int array [ROW][COLUMN] = {1};
fait pas signifie "mettre tous les éléments à un". Je vais essayer d'expliquer comment cela fonctionne, étape par étape.
La manière explicite et trop claire d'initialiser votre tableau serait la suivante :
#define ROW 2
#define COLUMN 2
int array [ROW][COLUMN] =
{
{0, 0},
{0, 0}
};
Cependant, le C vous permet de laisser de côté certains éléments d'un tableau (ou d'une structure/union). Vous pourriez par exemple écrire :
int array [ROW][COLUMN] =
{
{1, 2}
};
Cela signifie qu'il faut initialiser les premiers éléments à 1 et 2, et le reste des éléments "comme s'ils avaient une durée de stockage statique". Il y a une règle en C qui dit que tous les objets de durée de stockage statique, qui ne sont pas explicitement initialisés par le programmeur, doivent être mis à zéro.
Ainsi, dans l'exemple ci-dessus, la première ligne prend la valeur 1,2 et la suivante la valeur 0,0 puisque nous ne leur avons pas donné de valeurs explicites.
Ensuite, il existe une règle en C qui autorise un style d'accolade plus souple. Le premier exemple pourrait aussi bien être écrit comme
int array [ROW][COLUMN] = {0, 0, 0, 0};
bien qu'il s'agisse bien sûr d'un style pauvre, plus difficile à lire et à comprendre. Mais cette règle est pratique, car elle nous permet d'écrire
int array [ROW][COLUMN] = {0};
ce qui signifie : "initialiser la toute première colonne de la première ligne à 0, et tous les autres éléments comme s'ils avaient une durée de stockage statique, c'est-à-dire les mettre à zéro".
par conséquent, si vous tentez
int array [ROW][COLUMN] = {1};
cela signifie "initialiser la toute première colonne de la première ligne à 1 et mettre tous les autres éléments à zéro".