ProgrammationDéveloppeur Backend

Comment fonctionnent les tableaux en langage C ? Quelles sont les différences entre l'allocation statique, automatique et dynamique de mémoire pour les tableaux, et que faut-il prendre en compte lors de leur utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En langage C, les tableaux sont la structure de base pour stocker un ensemble ordonné d'éléments du même type. Ils offrent un accès rapide par index et sont étroitement liés au fonctionnement des pointeurs. Les tableaux peuvent être déclarés de manière statique, automatique (sur la pile), ou dynamiquement (dans le tas). Le type d'allocation influence la durée de vie du tableau, sa disponibilité dans différentes parties du code et les exigences de gestion de la mémoire.

Contexte
Le C d'origine ne permettait de définir que des tableaux statiques et automatiques, mais avec l'introduction de l'allocation dynamique de mémoire (fonctions malloc, calloc, free), de nouveaux motifs de conception ont émergé, augmentant la flexibilité du code.

Problème
Les développeurs se trompent souvent sur les tailles, la durée de vie et la libération des tableaux, ce qui conduit à des fuites de mémoire, des conditions de course et des corruptions de mémoire.

Solution
Choix minutieux du type de stockage en fonction de la tâche, suivi attentif de l'initialisation et libération opportune de la mémoire pour les tableaux dynamiques.

Exemple de code :

#include <stdio.h> #include <stdlib.h> int main() { // Automatique (sur la pile) int auto_arr[5] = {1,2,3,4,5}; // Statique (vit tant que le programme fonctionne) static int static_arr[5]; // Dynamique (dans le tas) int *dyn_arr = malloc(5 * sizeof(int)); for (int i = 0; i < 5; i++) dyn_arr[i] = i * 2; // Utilisation for (int i = 0; i < 5; i++) printf("%d ", dyn_arr[i]); printf(" "); free(dyn_arr); return 0; }

Caractéristiques clés :

  • Les tableaux stockent des éléments de manière contiguë en mémoire ce qui permet un accès rapide par index.
  • Le type de zone de stockage détermine la durée de vie du tableau (pile, mémoire statique, tas).
  • Les tableaux dynamiques nécessitent une gestion manuelle de la mémoire via malloc/calloc et free.

Questions pièges.

Peut-on connaître la taille d'un tableau dynamique via sizeof ?

Non, sizeof(ptr) pour un tableau dynamique renverra la taille du pointeur, et non celle du tableau. Il est nécessaire de stocker manuellement la taille ou d'utiliser une variable séparée.

int* arr = malloc(10 * sizeof(int)); printf("%zu ", sizeof(arr)); // Taille du pointeur, pas du tableau

Que se passe-t-il lorsqu'on dépasse les limites du tableau ?

En langage C, il n'y a pas de vérification automatique des limites du tableau : accéder en dehors des limites entraîne un comportement indéfini. Les erreurs ne sont détectées qu'au moment de l'exécution ou ne sont pas détectées du tout.

Peut-on retourner un tableau local (automatique) d'une fonction ?

Non ! Un tableau déclaré à l'intérieur d'une fonction est supprimé après la fin de celle-ci. Retourner un tel tableau entraîne un accès à de la mémoire déjà libérée.

int* create_wrong_array() { int arr[10]; return arr; // Erreur : retour d'un pointeur sur la pile }

Erreurs courantes et anti-modèles

  • Utilisation de tableaux locaux après la sortie de la fonction.
  • Accès hors des limites.
  • Appel oublié de free pour les tableaux dynamiques : fuites de mémoire.

Exemple de la vie réelle

Cas négatif

Un développeur crée un tableau sur la pile et retourne un pointeur vers celui-ci depuis une fonction. Le programme plante parfois ou retourne des données corrompues.

Avantages :

  • Pas de coût d'allocation dynamique (théorique).

Inconvénients :

  • Comportement instable, difficile à détecter.
  • Corruption de la pile, fuite de données.

Cas positif

Utilisation de l'allocation dynamique avec transmission de la taille et du pointeur, nettoyage de la mémoire via free. Tous les cas de libération de mémoire sont vérifiés par des tests unitaires.

Avantages :

  • Fiabilité garantie (pas de fuites).
  • Taille de tableau flexible.

Inconvénients :

  • Nécessité de gérer la mémoire manuellement.
  • Augmentation de la complexité de certaines fonctions.