ProgrammationDéveloppeur C

Que se passe-t-il lors du passage de pointeurs et de tableaux à une fonction en C ? Quelles sont les différences, les pièges et comment éviter les erreurs courantes ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Lors du passage d'un pointeur ou d'un tableau à une fonction en C, c'est en fait une copie de la valeur du pointeur (c'est-à-dire l'adresse mémoire) qui est passée, et non le tableau lui-même ou le contenu de la mémoire. Historiquement, les tableaux en C ne sont pas passés par valeur — au lieu de cela, un pointeur vers le premier élément du tableau est passé à la fonction. Ce mécanisme économise de la mémoire, mais peut engendrer des effets secondaires indésirables en cas de mauvaise utilisation.

Problème — confusion entre pointeurs et tableaux : les développeurs pensent souvent qu'à l'intérieur de la fonction, il est impossible de modifier le tableau externe ou que la fonction connaît automatiquement la taille du tableau passé. Dans la pratique, la fonction perd la taille initiale du tableau et peut facilement dépasser ses limites.

Solution — toujours passer explicitement la taille du tableau comme argument séparé, comprendre clairement la différence entre la copie d'un pointeur et la copie d'un objet, ne pas oublier que toute modification par le pointeur affecte les données d'origine.

Exemple de passage correct d'un tableau :

void print_array(const int* arr, size_t size) { for (size_t i = 0; i < size; ++i) printf("%d ", arr[i]); } int main() { int nums[] = {1,2,3,4,5}; print_array(nums, sizeof(nums)/sizeof(nums[0])); return 0; }

Caractéristiques clés :

  • L'adresse du tableau est passée à la fonction, et non une copie des éléments.
  • La taille du tableau doit être passée explicitement.
  • Les modifications des éléments à l'intérieur de la fonction changent le tableau externe.

Questions pièges.

Une fonction peut-elle connaître la longueur du tableau passé si celui-ci a été déclaré comme int arr[10]?

Réponse : Non, à l'intérieur de la fonction, l'expression sizeof(arr) renverra la taille du pointeur, et non celle du tableau entier. La taille doit être passée séparément.

Passer un tableau comme int arr[] et comme int arr dans les fonctions est-ce la même chose ?*

Réponse : Oui, dans la signature de la fonction, c'est équivalent — dans les deux cas, un pointeur vers int est passé. Les différences se situent uniquement au niveau de la syntaxe.

En modifiant les éléments d'un tableau à l'intérieur de la fonction, le tableau d'origine sera-t-il modifié ?

Réponse : Oui, puisque c'est un pointeur qui est passé, la fonction modifie la mémoire qu'il pointe.

Erreurs typiques et anti-patrons

  • Ne pas passer la taille du tableau comme argument (dépasser les limites).
  • Utiliser sizeof(arr) pour déterminer la taille du tableau dans la fonction (résultat incorrect).
  • Confondre int arr[10] et int* arr dans différents contextes.

Exemple de la vie quotidienne

Cas négatif

Le projet a implémenté une fonction d'initialisation des tableaux, déterminant la taille à l'intérieur de la fonction en utilisant sizeof(arr) / sizeof(arr[0]). Lors des tests, la fonction fonctionnait, mais en traitant d'autres tableaux — elle écrasait la mémoire d'autres utilisateurs ou ne fonctionnait pas correctement.

Avantages :

  • Simplification de la signature de la fonction.

Inconvénients :

  • Le programme plantait ou fonctionnait incorrectement avec d'autres données.

Cas positif

La fonction prenait toujours la taille du tableau comme paramètre séparé, la longueur étant calculée par la partie appelante. À l'intérieur de la fonction, seules les paramètres passés étaient utilisés.

Avantages :

  • Garantie de l'absence de dépassement de limites.
  • Code plus fiable, sûr et portable.

Inconvénients :

  • Nécessité de passer explicitement la taille, appel un peu plus long.