Pourquoi le calcul de la taille du tableau diffère à l'intérieur d'une fonction en C
Lors du passage d'un tableau à une fonction, C désintègre automatiquement le tableau en un pointeur à son premier élément. Ce pointeur porte l'adresse du premier élément du tableau mais pas sa taille.
Considérons cet exemple :
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); // Incorrect printf("%d\n", arrSize); } int main() { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); // Correct printf("%d\n", arrSize); // Prints 3 test(point); return 0; }
Dans main, sizeof(point) donne correctement la taille de l'ensemble du tableau ( 12 octets). Cependant, dans le test, sizeof(arr) donne 4 octets (la taille d'un pointeur entier), ce qui entraîne un calcul incorrect de la taille du tableau (un élément manquant).
Pour résoudre ce problème, la taille du tableau doit être explicitement passé en tant que paramètre distinct :
void test(int arr[], size_t elems) { int arrSize = elems; /* ... */ } int main() { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point) / sizeof(point[0])); /* ... */ }
Notez que sizeof(point)/sizeof(point[0]) fonctionne pour les tableaux alloués par la pile mais pas pour les tableaux alloués dynamiquement puisque il repose sur le mécanisme de désintégration sous-jacent.
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!