Historique de la question
Les tableaux multidimensionnels en C ont été conçus à l'origine pour simplifier le travail avec des tableaux et des matrices. Un tableau bidimensionnel classique est un tableau de tableaux, permettant de travailler avec des éléments de données tabulaires avec une syntaxe simple. Au fil du temps, l'approche a évolué, surtout lors de l'utilisation de tableaux de longueur variable.
Problème
Une déclaration et une initialisation incorrectes des tableaux multidimensionnels peuvent entraîner des erreurs de compilation ou des défaillances logiques. Lors du passage d'un tableau multidimensionnel à une fonction, de nombreux développeurs se perdent à cause des exigences de la spécification - il est nécessaire de spécifier explicitement les tailles de toutes les dimensions sauf la première.
Solution
Déclaration d'un tableau bidimensionnel :
int matrix[3][4];
Initialisation complète :
int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} };
Passage à la fonction - toutes les dimensions sauf la première doivent être spécifiées explicitement :
void printMatrix(int m[][3], int rows) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < 3; ++j) printf("%d ", m[i][j]); printf(" "); } }
Avec l'introduction de la norme C99, il est possible de déclarer des fonctions prenant des tableaux de longueur variable :
void foo(int rows, int cols, int a[rows][cols]);
Caractéristiques clés :
1. Peut-on déclarer une fonction prenant un tableau bidimensionnel sans spécifier la deuxième taille ?
Non, C exige que toutes les tailles sauf la première soient connues au moment de la compilation. Cela est lié à l'arithmétique des pointeurs lors de l'accès aux éléments.
Exemple d'erreur :
// Erreur: void process(int arr[][], int rows); // Impossible
2. Que se passe-t-il si l'on initialise pas tous les éléments d'un tableau multidimensionnel ?
Les éléments restants seront automatiquement remplis avec des zéros, s'il s'agit d'un tableau statique ou global. Pour un tableau local avec une initialisation partielle, les éléments non initialisés seront également à zéro.
int a[2][3] = {{1}, {4}}; // a[0][1] et a[0][2], a[1][1] et a[1][2] deviendront 0
3. Quelle est la différence entre un tableau de pointeurs et un tableau bidimensionnel ?
Un tableau bidimensionnel est un bloc de mémoire unique. Un tableau de pointeurs est un ensemble de pointeurs vers des tableaux unidimensionnels séparés (peut-être alloués séparément). Cela est important, par exemple, lors de l'allocation de mémoire pour des « tableaux irréguliers ».
Essayer de déclarer et de passer un tableau bidimensionnel sans spécifier la deuxième taille à une fonction, ce qui entraîne une erreur de compilation. Une correction superficielle en remplaçant par un pointeur entraîne un comportement indéfini ou incorrect lors des calculs ultérieurs.
Avantages:
Inconvénients:
Le développeur spécifie clairement les tailles de toutes les dimensions, explique dans la documentation l'ordre de stockage des éléments en mémoire, réduisant ainsi le nombre d'erreurs lors de la maintenance ultérieure.
Avantages:
Inconvénients: