Comprendre l'écart dans les valeurs sizeof() pour les tableaux transmis aux fonctions en C
En C, les tableaux peuvent présenter un comportement inattendu lorsqu'ils sont transmis aux fonctions. La question se pose : pourquoi l'opérateur sizeof() renvoie-t-il une valeur incorrecte lorsqu'un tableau est passé à une fonction, alors qu'il fournit la valeur correcte avant l'appel de la fonction ?
Pour résoudre ce problème, il faut comprendre que les tableaux en C subissent une dégradation du pointeur lorsqu'il est transmis aux fonctions. Lorsqu'un tableau est passé, il dégénère en un pointeur pointant vers le premier élément du tableau. Par conséquent, l'utilisation de sizeof() sur le paramètre de fonction évalue la taille du pointeur au lieu de l'ensemble du tableau.
Un exemple typique est donné dans la question :
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); printf("%d\n", arrSize); // 2 (wrong?!) } int main (int argc, const char * argv[]) { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); printf("%d\n", arrSize); // 3 (correct :-) ) test(point); return 0; }
Dans le main( ), la taille correcte du tableau est déterminée en divisant la taille de la mémoire allouée (obtenue à l'aide de sizeof(point)) par la taille de chaque élément (sizeof(point[0])). Cependant, dans la fonction test(), la taille calculée du tableau est incorrecte car sizeof(arr) renvoie la taille du pointeur vers le tableau, pas le tableau lui-même.
Pour résoudre ce problème et permettre à la fonction de déterminer la taille du tableau, elle doit être passée en tant que paramètre distinct :
void test(int arr[], size_t elems) { /* ... */ } int main(int argc, const char * argv[]) { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point)/sizeof(point[0])); /* ... */ }
Il est important de noter que l'astuce sizeof(point)/sizeof(point[0]) ne fonctionne que pour les tableaux alloués sur la pile. Pour les tableaux alloués dynamiquement, il renverra un résultat incorrect, car la taille du tableau n'est pas stockée avec le pointeur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!