Maison >développement back-end >C++ >Pourquoi « sizeof » renvoie-t-il une taille de tableau incorrecte lors du passage d'un tableau à une fonction C ?

Pourquoi « sizeof » renvoie-t-il une taille de tableau incorrecte lors du passage d'un tableau à une fonction C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-14 15:35:16959parcourir

Why Does `sizeof` Return an Incorrect Array Size When Passing an Array to a C Function?

Différence de taille de tableau lors du passage à une fonction

L'opérateur sizeof() signale une valeur inexacte pour un tableau lorsqu'il est transmis à une fonction. 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 point[3] = {50, 30, 12};

    int arrSize = (int)(sizeof(point) / sizeof(point[0]));
    printf("%d\n", arrSize); // 3 (correct)

    test(point);

    return 0;
}

Lorsqu'il est appelé depuis main(), l'opérateur sizeof() rapporte avec précision la taille du tableau, mais dans la fonction test(), il sous-estime la taille d'un élément. . Cette disparité se produit car lorsqu'un tableau est transmis à une fonction en C, il se désintègre en un pointeur référençant le premier élément du tableau. Par conséquent, sizeof(arr) calcule la taille du pointeur plutôt que la taille du tableau sous-jacent.

Pour remédier à ce problème, la taille du tableau doit être explicitement transmise en tant que paramètre distinct à la fonction :

void test(int arr[], size_t elems) {
    // ...
}

int main() {
    int point[3] = {50, 30, 12};
    // ...
    test(point, sizeof(point) / sizeof(point[0]));
    // ...
}

Alternativement, pour les tableaux alloués dynamiquement (non illustrés ici), la fonction standard de la bibliothèque C stdlib.h peut être utilisée pour obtenir avec précision la taille du tableau.

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