HOWTO · C

Comment obtenir la taille d’un tableau en C

Ce tutoriel présente des méthodes en C pour déterminer la taille d’un tableau. Apprenez à utiliser efficacement l’opérateur sizeof() et explorez des méthodes alternatives comme les macros et les fonctions. La maîtrise de ces techniques est essentielle pour une gestion efficace de la mémoire et la manipulation des tableaux en programmation C.

Sur cette page

Pour un tableau de taille fixe dans la même portée, divisez sa taille totale en octets par la taille en octets d’un élément : sizeof array / sizeof array[0]. Le résultat est le nombre d’éléments. À l’intérieur d’une fonction, transmettez ce nombre séparément, car un paramètre tableau est traité comme un pointeur.

Utiliser sizeof pour compter les éléments d’un tableau de taille fixe

sizeof renvoie une taille en octets. Pour un tableau visible dans la portée actuelle, sizeof values est la taille de l’ensemble du tableau, tandis que sizeof values[0] est la taille d’un élément. Leur quotient donne le nombre d’éléments sans supposer qu’un int a une taille en octets particulière.

Cet exemple complet en C compte un tableau de taille fixe et transmet le résultat à une fonction. Les valeurs et l’appel de fonction montrent comment adapter le modèle à un autre type d’élément ou à un autre tableau.

#include <stdio.h>
#include <stddef.h>

void print_values(const int *values, size_t count)
{
    size_t i;
    printf("Element count: %d\n", (int)count);
    for (i = 0; i < count; ++i) {
        printf("%d ", values[i]);
    }
    putchar('\n');
}

int main(void)
{
    int values[] = {4, 8, 15, 16};
    size_t count = sizeof values / sizeof values[0];

    printf("Array count: %d\n", (int)count);
    print_values(values, count);
    return 0;
}
Array count: 4
Element count: 4
4 8 15 16

Pour cette démonstration, la conversion en int est sûre car le tableau comporte quatre éléments. Pour un comptage général, utilisez un spécificateur de format adapté à size_t dans la bibliothèque C cible.

Pourquoi sizeof donne la taille du pointeur à l’intérieur d’une fonction

Dans la déclaration d’un paramètre de fonction, int values[] est ajusté en int *values. Par conséquent, sizeof values dans cette fonction mesure le pointeur, et non le tableau de l’appelant. Diviser cette valeur par sizeof values[0] ne permet pas de retrouver le nombre d’éléments d’origine, et la taille du pointeur peut varier selon la plateforme.

Conservez le calcul du nombre d’éléments du tableau dans la portée où le tableau est déclaré, puis transmettez ce nombre à toute fonction qui en a besoin. Cela s’applique aux paramètres tableau ordinaires ainsi qu’aux paramètres écrits avec la syntaxe de pointeur.

Utiliser une macro pour les tableaux dans la même portée

Une macro peut rendre le calcul dans la même portée réutilisable : #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])). Utilisez-la là où array est un véritable tableau, par exemple ARRAY_SIZE(values) dans la portée qui déclare values. Lorsqu’un tableau est passé à une fonction, la macro voit un pointeur et ne peut pas déterminer la longueur d’origine du tableau. Pour les tableaux multidimensionnels, l’expression compte les éléments de la dimension externe.

Transmettre le nombre d’éléments à une fonction

Déclarez le paramètre de la fonction comme un pointeur (ou un paramètre tableau) et fournissez un nombre size_t séparé, comme le fait print_values(values, count) ci-dessus. L’appelant calcule le nombre tant que le tableau complet est dans la portée ; la fonction utilise ce nombre comme borne de sa boucle. Ce modèle fonctionne pour les tableaux de taille fixe et pour le stockage alloué dynamiquement, tant que l’appelant fournit le nombre d’éléments. Conservez le pointeur et le nombre ensemble pour que la fonction traite exactement les éléments prévus.