386 votes

Comment trouver le ' sizeof ' (un pointeur qui pointe vers un tableau) ?

Tout d’abord, voici un code :

Y a-t-il un moyen pour savoir la taille du tableau qui `` pointe (au lieu de juste donner sa taille, ce qui est quatre octets) ?

330voto

Paul Tomblin Points 83687

Non, vous ne pouvez pas. Le compilateur ne sait pas ce que le pointeur pointe. Il y a des trucs, comme la fin du tableau avec un out-of-band de la valeur et puis en comptant la taille jusqu'à ce que la valeur, mais ce n'est pas à l'aide de sizeof.

Une autre astuce est celle mentionnée par Zan, qui est à ranger la taille quelque part. Par exemple, si vous êtes alloue dynamiquement le tableau, allouer un bloc un int plus grand que celui dont vous avez besoin, la planque de la taille à la première de type int, et le retour ptr+1 comme le pointeur vers le tableau. Lorsque vous avez besoin de la taille, décrémenter le pointeur et coup d'oeil à l'planqué valeur. N'oubliez pas de libérer l'ensemble du bloc de départ depuis le début, et pas seulement le tableau.

111voto

Zan Lynx Points 23100

La réponse est « Non ».

Que faire des programmeurs C est stocker la taille du tableau quelque part. Il peut faire partie d’une structure, ou le programmeur peut tricher un peu et malloc() a demandé à plus de mémoire pour stocker une valeur de longueur avant le début du tableau.

55voto

Ryan Points 3745

J'hésite à le mentionner (j'espère ne pas descendre en-voté), mais pensé que je le mentionne dans le cas où il est utile.

Pour les tableaux dynamiques (malloc ou C++ nouveaux), vous avez besoin pour stocker la taille de la matrice comme mentionné par d'autres, ou peut-être construire un tableau gestionnaire de la structure qui gère à ajouter/supprimer/compter/etc. Malheureusement, C de ne pas le faire presque aussi bien que le C++ depuis en gros, vous avez à construire pour chaque différent type de tableau que vous stockez, ce qui est contraignant si vous disposez de plusieurs types de tableaux que vous avez besoin pour gérer.

Pour les tableaux statiques, comme dans votre exemple, il y a une commune de la macro utilisée pour obtenir la taille mais pas recommandé car il ne vérifie pas si le paramètre est vraiment un tableau statique. La macro est utilisée dans le code réel, bien que, par exemple, dans le noyau de Linux les en-têtes bien qu'il peut être légèrement différent de celui ci-dessous:

#if !defined(ARRAY_SIZE)
    #define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
#endif

int main()
{
    int days[] = {1,2,3,4,5};
    int *ptr = days;
    printf("%u\n", ARRAY_SIZE(days));
    printf("%u\n", sizeof(ptr));
    return 0;
}

Vous pouvez google pour raisons de se méfier des macros comme cela. Être prudent.

Si possible, le C++ stdlib comme vecteur qui est beaucoup plus sûr et plus facile à utiliser.

19voto

skurton Points 250

Il y a une solution propre aux modèles C++, sans utiliser de sizeof(). La fonction getSize() suivante retourne la taille d’un tableau statique :

Voici un exemple avec une structure foo_t :

Sortie :

6voto

David Points 31

Pour cet exemple précis, oui, il y a, si vous utilisez typedefs (voir ci-dessous). Bien sûr, si vous le faites de cette façon, vous êtes tout aussi hors d’utiliser SIZEOF_DAYS, puisque vous savez ce que le pointeur pointe vers.

Si vous avez un (void *) pointeur, comme retourné par malloc() ou similaires, puis, non, il n’y aucun moyen de déterminer quelles données structurent le pointeur pointe vers et par conséquent, aucun moyen de déterminer sa taille.

Sortie :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X