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 `sizeof()` renvoie-t-il des valeurs différentes pour les tableaux à l'intérieur et à l'extérieur d'une fonction en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-21 18:35:09888parcourir

Why Does `sizeof()` Return Different Values for Arrays Inside and Outside a Function in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn