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

Pourquoi sizeof() se comporte-t-il différemment lors de la transmission de tableaux à des fonctions en C ?

Barbara Streisand
Libérer: 2024-11-11 17:56:03
original
998 Les gens l'ont consulté

Why Does sizeof() Behave Differently When Passing Arrays to Functions in C  ?

Anomalie sizeof() lors du passage de tableaux à des fonctions en C

En C, l'opérateur sizeof() agit différemment lorsqu'il s'agit de tableaux transmis aux fonctions que lorsqu’ils sont utilisés dans la fonction principale. Cet écart peut être déroutant pour les débutants.

Passer correctement un tableau

Pour passer correctement un tableau à une fonction, il est essentiel de le passer par référence, en utilisant la syntaxe :

int length_of_array(int (&arr)[N]);
Copier après la connexion

Où :

  • arr est le tableau transmis à la fonction.
  • N est une constante entière représentant la taille du tableau.

Utilisation de Sizeof() dans les fonctions

Lors de l'utilisation de sizeof() dans la fonction, ce qui suit est vrai :

sizeof(arr) == N * sizeof(int);
Copier après la connexion

Explication :

  • sizeof(arr) renvoie la taille totale de la mémoire allouée au tableau, qui est N fois la taille de chaque élément (sizeof(int)) .

Problème de passage incorrect du tableau

Dans l'extrait de code fourni, la fonction length_of_array() passe par inadvertance le tableau par pointeur, comme ceci :

int length_of_array(int some_list[]);
Copier après la connexion

Cette méthode de transmission incorrecte provoque le problème suivant :

  • sizeof(some_list) renvoie la taille du pointeur vers le premier élément du tableau.
  • sizeof(*some_list) renvoie la taille d'un seul élément du tableau.
  • La division de ces valeurs donne toujours 1, quelle que soit la taille réelle du tableau.

Solution de contournement à l'aide de modèles

Pour surmonter cette limitation, on peut utiliser une approche basée sur des modèles comme celle-ci :

template<size_t N>
int length_of_array(int (&amp;arr)[N])
{
    std::cout << N << std::endl; // Will output the correct array size
    return N;
}
Copier après la connexion

Point clé :

La différence essentielle entre les deux méthodes réside dans le passage de tableaux par référence plutôt que par pointeur. Le premier préserve la connaissance de la taille du tableau, tandis que le second ne le fait pas.

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