Maison > développement back-end > C++ > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-11 07:31:02
original
367 Les gens l'ont consulté

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

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

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

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!

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