Maison >développement back-end >C++ >Pourquoi `sizeof()` renvoie-t-il des valeurs différentes pour les tableaux à l'intérieur et à l'extérieur d'une fonction en C ?
Pourquoi passer un tableau à une fonction modifie sa valeur sizeof()
En programmation C, passer un tableau à une fonction peut conduire à comportement inattendu concernant sa taille lors de sa récupération à l'aide de sizeof(). Cette particularité est due au concept de dégradation de tableau.
Dégradation de tableau expliquée
Lorsqu'un tableau est passé à une fonction, il est implicitement converti ou "se désintègre" en un pointeur vers son premier élément. Cette conversion masque efficacement la taille réelle du tableau, car sizeof() opère désormais sur le pointeur plutôt que sur le tableau d'origine.
Exemple avec Code
Considérez l'extrait de code suivant :
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); printf("%d\n", arrSize); // 2 (incorrect) } 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 cet exemple, deux appels à sizeof() sont effectués. Le premier appel, dans la fonction main(), renvoie correctement la taille du point du tableau à 3. Cependant, le deuxième appel dans la fonction test() renvoie incorrectement 2. Cette incompatibilité de résultat se produit parce que le point du tableau s'est désintégré en un pointeur lorsque il a été transmis à la fonction.
Surmonter la dégradation du tableau
Pour préserver la vraie taille d'un tableau lorsqu'il est transmis à une fonction, il faut transmettez explicitement un paramètre supplémentaire à la fonction qui spécifie la taille.
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])); /* ... */ }
En passant la taille en tant que paramètre distinct, la fonction peut déterminer avec précision la taille réelle du tableau et effectuer des opérations en conséquence.
Remarque :
L'astuce sizeof(point)/sizeof(point[0]) pour obtenir la taille du tableau peut ne pas toujours fonctionner dynamiquement tableaux alloués.
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!