Maison >développement back-end >C++ >Pourquoi `sizeof()` renvoie-t-il des résultats inattendus pour les paramètres de tableau dans les fonctions C ?

Pourquoi `sizeof()` renvoie-t-il des résultats inattendus pour les paramètres de tableau dans les fonctions C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-11 07:31:02432parcourir

Why Does `sizeof()` Return Unexpected Results for Array Parameters in C   Functions?

Pourquoi sizeof() ne fonctionne pas de la même manière pour les paramètres de tableau dans les fonctions C

En C, les tableaux se désintègrent en pointeurs lorsqu'ils sont transmis à fonctions, rendant l'utilisation de sizeof() peu fiable pour déterminer la taille du tableau. Pour comprendre cela, analysons la fonction suivante :

int length_of_array(int some_list[])
{
    return sizeof(some_list) / sizeof(*some_list);
}

Problème avec le paramètre Array

Le paramètre some_list est déclaré comme un tableau, mais la signature de la fonction est effectivement équivalent à int length_of_array(int* some_list). En effet, les tableaux se décomposent en pointeurs dans les paramètres de fonction.

Effet sur sizeof()

L'utilisation de sizeof(some_list) dans ce contexte calcule la taille du pointeur, ce qui donne dans une valeur de 1. La division par sizeof(*some_list) (la taille d'un entier) donne 1.

Exemple

Dans l'exemple donné, malgré le tableau num_list contenant 15 éléments, la fonction length_of_array() renvoie systématiquement 1, comme le montre le résultat :

This is the output from direct coding in the
int main function:
15
This is the length of the array determined
by the length_of_array function:
1

Solution utilisant un modèle Fonctions

Pour déterminer la taille du tableau dans les fonctions, on peut utiliser des fonctions de modèle et passer le tableau par référence :

template<size_t N>
int length_of_array(int (&amp;arr)[N])
{
    return N;
}

Dans ce cas, le paramètre de modèle N capture la taille connue du tableau, permettant à sizeof() de renvoyer la valeur correcte.

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