Maison > développement back-end > C++ > Pourquoi `sizeof()` renvoie-t-il des tailles de tableau incorrectes lorsqu'il est transmis aux fonctions C ?

Pourquoi `sizeof()` renvoie-t-il des tailles de tableau incorrectes lorsqu'il est transmis aux fonctions C ?

Patricia Arquette
Libérer: 2025-01-01 10:41:11
original
195 Les gens l'ont consulté

Why Does `sizeof()` Return Incorrect Array Sizes When Passed to C Functions?

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;
}
Copier après la connexion

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]));
   /* ... */
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal