Oui, il est requis que la taille d'un tableau T[n]
être n * sizeof (T)
.
La norme définit les tableaux en §6.2.5/20 :
Un type de tableau décrit un ensemble non vide d'objets alloués de manière contiguë avec un type d'objet membre particulier.....
En outre, le sizeof
L'opérateur donne le nombre total d'octets dans le tableau ( §6.5.3.4/4 ):
Quand taille de est appliqué .... à une opérande de type tableau, le résultat est le nombre total d'octets dans le tableau. Lorsqu'elle est appliquée à une opérande de type structure ou union, le résultat est le nombre total d'octets d'un tel objet, y compris le remplissage interne et arrière.
Comme un tableau est constitué d'une allocation contiguë d'objets, il ne peut y avoir de remplissage interne. Et puisque le rembourrage de fin de tableau est mentionné explicitement en ce qui concerne l'élément sizeof
opérateur uniquement dans le contexte des unions et des structures, il semble clair que les tableaux ne doivent pas posséder un tel remplissage de fin.
Enfin, notez que dans §6.2.6.1/4 est déclaré :
Les valeurs stockées dans les objets sans champ de bits de tout autre type d'objet sont constituées de n x CHAR_BIT bits, où n est la taille d'un objet de ce type, en octets. La valeur peut être copiée dans un objet de type char non signé [ n ] (par exemple, par memcpy) ; l'ensemble d'octets résultant est appelé le représentation des objets de la valeur.
Supposons que les tableaux pourrait ont des octets de remplissage à la fin, considérez un tableau unsigned char A[n]
et on considère en outre le tableau unsigned char B[sizeof A]
vers lequel tous les octets (y compris les éventuels octets de remplissage) de A[]
ont été copiés. Maintenant, A[]
doit être de la même taille que B[]
puisque ( §6.2.6.1/8 ):
Lorsqu'un opérateur est appliqué à une valeur qui a plus d'une représentation d'objet, la représentation d'objet utilisée ne doit pas affecter la valeur du résultat.
Cela signifie que B[]
doit n'ont pas de remplissage de fin, ce qui signifie que les tableaux peuvent avoir des octets de remplissage de fin, sauf dans certaines conditions particulières qui ne sont mentionnées nulle part dans la norme, ou encore que les tableaux peuvent avoir un remplissage de fin, sauf pour les tableaux de unsigned char
. Étant donné qu'aucune de ces possibilités n'est mentionnée dans la norme, il semble raisonnable de conclure que les tableaux ne doivent pas avoir de remplissage de fin en premier lieu.