Historique de la question
Dans le langage C, le travail avec des tableaux est un aspect fondamental de la programmation. C propose deux types principaux de tableaux : statiques (dont la taille est connue au moment de la compilation et qui sont alloués sur la pile, ou dans la mémoire statique/globale) et dynamiques (dont la taille est définie à l'exécution). Les tableaux statiques sont utilisés depuis la création du langage C, mettant en avant la performance et la simplicité.
Problème
Si l'on ne comprend pas la différence entre les tableaux statiques et dynamiques, on peut rencontrer des erreurs : dépassement de tableau, non-libération de mémoire, ou des erreurs de gestion du cycle de vie des données. Une mauvaise initialisation des tableaux statiques peut entraîner la lecture de données abandonnées ou non initialisées.
Solution
La déclaration d'un tableau statique se présente ainsi :
int arr[5] = {1, 2, 3, 4, 5};
Ici, la taille et le contenu du tableau sont définis au moment de la compilation, la mémoire est allouée sur la pile (pour les tableaux automatiques locaux) ou dans la mémoire statique (lors de la déclaration du tableau comme static ou global). Une attention particulière doit être portée à l'initialisation partielle, lorsque les éléments non spécifiés sont remplis de zéros.
La taille d'un tableau statique ne peut pas être modifiée durant l'exécution du programme, ce qui le différencie des tableaux dynamiques.
Caractéristiques clés :
1. Que se passe-t-il si un tableau statique n'est pas explicitement initialisé dans une fonction ?
Les tableaux statiques automatiques (auto) locaux ont des éléments non initialisés avec des valeurs indéfinies. Cependant, si le tableau est déclaré avec le modificateur static ou comme global, tous les éléments seront initialisés à zéro par défaut.
Exemple :
void foo() { int arr1[3]; // Valeurs non définies ! static int arr2[3]; // Tous les éléments sont égaux à 0 }
2. Peut-on passer un tableau statique à une fonction de manière à ce que la fonction puisse modifier sa taille ?
Non, la taille d'un tableau statique ne peut pas être modifiée — elle est fixée lors de la déclaration. La fonction peut travailler avec son contenu, mais pas avec sa taille.
Exemple de passage correct du tableau :
void processArray(int arr[], int size) { arr[0] = 42; }
3. Que se passe-t-il si on dépasse les limites d'un tableau statique ? Une erreur d'exécution se produira-t-elle ?
Non, le langage C ne vérifie pas les débordements de tableau. Un tel comportement est considéré comme un comportement indéfini et peut entraîner des pannes, des corruptions de données ou des bugs cachés.
Un développeur déclare un tableau local, oublie de l'initialiser et l'utilise ensuite dans une boucle. Le programme produit des résultats différents à chaque exécution, et un crash peut surviennent lors de la lecture.
Avantages :
Inconvénients :
Le développeur initialise explicitement le tableau avec des valeurs, ou le déclare comme static pour une initialisation automatique à zéro. Il contrôle toujours la taille et les limites lors de l'utilisation du tableau.
Avantages :
Inconvénients :