ProgrammationDéveloppeur C

Quelles sont les différences entre les pointeurs et les tableaux en C ? Comment passer correctement un tableau à une fonction ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Les pointeurs et les tableaux en C sont liés, mais ce ne sont pas la même chose :

  • Tableau — un ensemble d'éléments de même type en mémoire, dont la taille est définie.
  • Pointeur — une variable qui stocke l'adresse en mémoire, vers laquelle peut pointer un tableau ou un objet individuel.

Lors du passage d'un tableau à une fonction, un pointeur vers le premier élément du tableau est en fait transmis (c'est pourquoi sizeof à l'intérieur de la fonction ne donne pas la taille de l'ensemble du tableau, mais seulement la taille du pointeur).

Syntaxe de passage :

void foo(int arr[], int size) { // arr — en fait int* for (int i = 0; i < size; ++i) printf("%d ", arr[i]); } int main() { int data[5] = {1,2,3,4,5}; foo(data, 5); }

Question piège.

Question: Que renverra l'expression sizeof(arr) à l'intérieur de la fonction, si arr est un paramètre de type int arr[] ?

Réponse: Renvoie la taille du pointeur (sizeof(int*)), et non la taille de l'ensemble du tableau. Car un pointeur vers le premier élément est passé à la fonction, l'information sur la longueur est perdue.

Exemple de code :

void printSize(int arr[]) { printf("%zu ", sizeof(arr)); // sizeof(int*) est généralement 4 ou 8 }

Histoire

Dans un projet commercial, un code a été écrit pour calculer la moyenne des valeurs dans un tableau, où ils prenaient sizeof(arr) / sizeof(arr[0]) pour le nombre d'éléments à l'intérieur de la fonction, ce qui renvoyait toujours 1 ou 2 au lieu du nombre réel d'éléments. Cela a conduit à un fonctionnement incorrect du programme avec les données, moyennant de manière incorrecte les valeurs.


Histoire

Dans un projet, un tableau alloué dynamiquement a été passé à une fonction sans stockage séparé de la longueur (size). En conséquence, la fonction ne savait pas combien d'éléments étaient alloués, ce qui a conduit à un débordement, des fuites ou une corruption de la mémoire.


Histoire

Un tableau de taille fixe a été utilisé par erreur comme pointeur, et certains compilateurs autorisaient l'affectation directe via memcpy de l'ensemble du tableau au lieu de ses éléments. Cela a conduit à une erreur non évidente, où des parties de la structure de données étaient perdues ou un débordement de pile se produisait.