Les pointeurs et les tableaux en C sont liés, mais ce ne sont pas la même chose :
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: 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.
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.